2011-07-29 17 views
5

Bir kez bir hayvan rengi belirtmek istiyorum ve aynı türün tüm hayvanları için aynıdır. hangi olamaz zaten bir sözleşmesi olarak,Scala'da soyut nesne değerlerini ve yöntemlerini nasıl bildiriyorsunuz?

object Dog extends Animal {val color = "green"} 
Bu nesne olması gerekir

bireysel hayvanlar renkleri

abstract object Animal {val color: String} 

Sonra belirtin:

yüzden yapmak istiyorum Hayvan nesnesinde yalnızca fabrika yöntemiyle hayvanların yapılması da değiştirildi ve fabrika yöntemlerinin renklere erişmesi gerekiyor. , ör.

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

nasıl aslında göz önüne alındığında, scala bu yaparsınız "tek sınıfları deklare ancak tanımlanmamış üye var olabilir"?

Bunu özelliklerle kullanarak hacky yolunu düşünebilirim, ama umarım daha iyi bir şey vardır.

[EDIT] Dolayısıyla, karmaşık nedenlerden dolayı değerleri/yöntemleri tutmak için özellikleri kullanamıyorum. Geçerli çözüm, çocuk nesnesinin bir nesneyi kullanarak ana nesne ile statik olarak kaydedilmesini ve bir nesnede tanımlanması gereken araç olmayan değerlere ve yöntemlere erişmemi sağlar. Hala daha iyi bir çözüm bulmayı umuyorum.

cevap

15

object s tanımına göre genişletemezsiniz. Yani evet, bir özelliği gerekir, ancak bu konuda hacky bir şey görmüyorum:

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

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

veya daha iyi

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 = ... 
} 
İlgili konular