2011-07-29 34 views
5

Tôi muốn chỉ định màu động vật một lần, và nó giống nhau cho tất cả các loài động vật cùng loài.Làm thế nào để bạn khai báo các giá trị và phương thức trừu tượng trong scala?

Vì vậy, tôi muốn làm:

abstract object Animal {val color: String} 

Và sau đó xác định động vật màu sắc cá nhân với

object Dog extends Animal {val color = "green"} 

này cần phải được trong đối tượng, như tôi đã có một quy ước mà không thể thay đổi chỉ làm động vật với phương pháp nhà máy cũng tuyên bố trong đối tượng động vật, và các phương pháp nhà máy cần truy cập vào màu sắc. ví dụ:

abstract object Animal { 
    val color: String 
    def makeAnimal(args): Animal = ... 
} 

Làm cách nào để thực sự thực hiện điều này trong scala, vì "chỉ các lớp học có thể đã khai báo nhưng chưa xác định thành viên"?

Tôi có thể nghĩ ra cách hacky để thực hiện điều này bằng cách sử dụng các đặc điểm, nhưng tôi hy vọng có điều gì đó tốt hơn.

[EDIT] Vì vậy, hóa ra tôi không thể sử dụng các đặc điểm để giữ các giá trị/phương pháp vì các lý do phức tạp. Giải pháp hiện tại liên quan đến việc đăng ký tĩnh đối tượng con với đối tượng cha bằng cách sử dụng một đặc điểm, và điều đó cho phép tôi truy cập các giá trị và các phương thức không có đặc điểm phải được xác định trong một đối tượng. Tôi vẫn hy vọng cho một giải pháp tốt hơn.

Trả lời

15

Bạn không thể mở rộng object s, theo định nghĩa. Vì vậy, có, bạn cần một đặc điểm, nhưng tôi không thấy bất cứ điều gì về vấn đề này hacky:

trait AnimalCompanion { 
    val color: String 
    def makeAnimal(args): Animal // if you have same args everywhere 
} 

object Dog extends AnimalCompanion { 
    val color = ... 
    def makeAnimal(args) = ... 
} 

hoặc thậm chí tốt hơn

trait AnimalCompanion[A <: Animal] { 
    val color: String 
    def makeAnimal(args): A 
} 

class Dog extends Animal 

object Dog extends AnimalCompanion[Dog] { 
    val color = ... 
    def makeAnimal(args): Dog = ... 
} 
Các vấn đề liên quan