2015-06-18 13 views
7

Có cách nào để xác định một tập hợp các lựa chọn thay thế của một loại phổ biến:Scala - đôi bên cùng có những đặc điểm độc quyền

trait Mutability 
trait Mutable extends Mutability 
trait Immutable extends Mutability 

và có trình biên dịch ngăn cản cái gì đó như:

object Hat extends Mutable with Immutable 

Tôi tin rằng tôi có thể lực lượng một số lỗi biên dịch bằng cách có một phổ biến, mâu thuẫn thành viên nhưng được thông báo lỗi là một chút xiên:

trait Mutability 
trait Mutable extends Mutability { protected val conflict = true } 
trait Immutable extends Mutability { protected val conflict = true } 

object Hat extends Mutable with Immutable 

<console>:10: error: object Hat inherits conflicting members: 
value conflict in class Immutable$class of type Boolean and 
value conflict in class Mutable$class of type Boolean 
(Note: this can be resolved by declaring an override in object Hat.) 
    object Hat extends Immutable with Mutable 

Có cách nào trực tiếp hơn để thể hiện ràng buộc này và không cho phép ai đó làm việc xung quanh nó bằng cách lấy gợi ý được cung cấp bởi trình biên dịch (ghi đè 'xung đột' trong Hat)?

Thanks cho bất kỳ những hiểu biết

+0

Điều này đạt được mục tiêu gì? Tôi không thể nhớ lại bất cứ lúc nào tôi muốn làm điều này .. – Daenyth

+0

Đầu tiên, cảm ơn những ý tưởng bên dưới, vẫn đang cân nhắc xem liệu tôi có thể có được một giải pháp kín (không cho phép sai lầm tất cả quá dễ dàng không " MutabilityLevel [Mutability] "để trượt qua). Thứ hai, theo mục tiêu. Có hai mức mục tiêu: (1) đặc điểm đánh dấu cho các trình xử lý tín hiệu mà chúng có thể an toàn không xử lý các sự kiện cập nhật cho các trường hợp loại này và (2) thực sự mở rộng đặc điểm Mutable để xác định các sự kiện đó: Sự kiện lớp [T <: Mutable ] Ví dụ: { trường hợp thêm lớp (T) trường hợp loại bỏ (T) }. – jmcnulty

+0

'lớp Mat (tên: Chuỗi) mở rộng Mutable' ' lớp Pat mở rộng Không thể xóa ' Trình xử lý có thể giả định rằng đối tượng PatEvents mở rộng Sự kiện [Pat] 'không thể biên dịch và' PatEvents.Add/Remove' không tồn tại – jmcnulty

Trả lời

3

Tôi nghĩ rằng điều này có thể làm việc

sealed trait Mutability 
case object Immutable extends Mutability 
case object Mutable extends Mutability 

trait MutabilityLevel[A <: Mutability] 

class Foo extends MutabilityLevel[Immutable.type] 

này (ab?) Sử dụng thực tế là bạn không thể mở rộng cùng một đặc điểm hai lần với tham số khác nhau

scala> class Foo extends MutabilityLevel[Immutable.type] with MutabilityLevel[Mutable.type] 
<console>:11: error: illegal inheritance; 
self-type Foo does not conform to MutabilityLevel[Immutable.type]'s selftype MutabilityLevel[Immutable.type] 
     class Foo extends MutabilityLevel[Immutable.type] with MutabilityLevel[Mutable.type] 
         ^
<console>:11: error: illegal inheritance; 
self-type Foo does not conform to MutabilityLevel[Mutable.type]'s selftype MutabilityLevel[Mutable.type] 
     class Foo extends MutabilityLevel[Immutable.type] with MutabilityLevel[Mutable.type] 

Tuy nhiên ..

scala> class Foo extends MutabilityLevel[Mutability] 
defined class Foo 
+0

Bạn có thể sửa lỗi bằng cách niêm phong 'MutabilityLevel' và thêm một cấp độ khác, ví dụ 'trait Immutable mở rộng MutabilityLevel [MutabilityLevel.I]'. –

+0

@JCracknell người gọi sau đó có thể mở rộng Không thể thay đổi và cung cấp cho nó triển khai không đúng. – Daenyth

+0

Có, tuy nhiên nó sẽ ngăn cản việc tạo ra một 'MutabilityLevel [Mutability]'. –

Các vấn đề liên quan