2010-03-24 36 views
28

Theo như tôi có thể nói, Scala có định nghĩa cho lớp giá trị liệt kê cho giá trị (Int), Value (String) và Value (Int, String).Overriding Scala Enumeration Value

Có ai biết ví dụ về việc tạo phân lớp Giá trị mới để hỗ trợ một hàm tạo khác không?

Ví dụ: Nếu tôi muốn tạo đối tượng liệt kê với giá trị (Int, String, String), tôi sẽ làm như thế nào? Tôi muốn tất cả các lợi ích khác của việc sử dụng lớp Enumeration.

Cảm ơn.

Trả lời

40

Giá trị liệt kê là trường hợp của lớp Val. Lớp này có thể được mở rộng và một phương thức nhà máy có thể được thêm vào.

object My extends Enumeration { 
    val A = Value("name", "x") 
    val B = Value("other", "y") 
    class MyVal(name: String, val x : String) extends Val(nextId, name) 
    protected final def Value(name: String, x : String): MyVal = new MyVal(name, x) 
} 

scala> My.B.id 
res0: Int = 1 

scala> My.B.x 
res1: String = y 
+2

Tuyệt vời! Hoạt động chính xác như tôi muốn. Cảm ơn. – Ralph

+0

@Thomas Jung: Ý tưởng của bạn thật tuyệt vời, nhưng tôi không thể sử dụng nó. Có một cảnh báo "đã nhập" My 'bị ẩn vĩnh viễn theo định nghĩa đối tượng trong gói " Cuối cùng, tôi đã thêm dòng này: nhập My = Value vào ví dụ này và nó hoạt động. Tôi vẫn không hiểu tại sao, Bạn có thể giải thích nó không? –

+0

Để sử dụng 'My' liệt kê, trước tiên bạn phải nhập nó với' import My._' và cũng thêm đoạn mã sau vào đối tượng 'My':' type My = MyVal', vì vậy bạn có thể truy cập vào x val. – metch

1

Thực tế trong liệt kê Scala có ý nghĩa đơn giản hơn nhiều so với Java. Vì mục đích của bạn, bạn không cần phải phân lớp Enumeration cũng như giá trị của nó theo bất kỳ cách nào, bạn chỉ cần khởi tạo kiểu của riêng bạn trong đối tượng đồng hành của nó như là một val. Bằng cách này, bạn sẽ có được mô hình truy cập quen thuộc của val value:MyEnum = MyEnum.Value như bạn đã có trong Java mà không thể có trong ví dụ được cung cấp bởi Thomas Jung. Ở đó bạn sẽ có def value:My.MyVal = MyEnum.Value mà là kinda khó hiểu như nó có vẻ với tôi bên cạnh tất cả các hackiness của giải pháp. Dưới đây là một ví dụ về những gì tôi đề xuất:

class MyEnum(myParam:String) 

object MyEnum { 
    val Value1 = new MyEnum("any parameters you want") 
    val Value2 = new MyEnum("") 
    object Value3 extends MyEnum("A different approach to instantialization which also lets you extend the type in place") 
} 

Ở đây bạn sẽ tìm thấy một ví dụ phức tạp hơn: Scala Best Practices: Trait Inheritance vs Enumeration