2010-03-11 16 views
5

İşte sahip olduğum sınıfların basitleştirilmesi:Scala'da, bir liste içeren somut bir alanı geçersiz kılabilir ve alt sınıfa bir şey ekleyebilir miyim?

trait RequiredThings { 
    val requiredThings: Seq[String] 
} 

class SimpleCalculator with RequiredThings { 
    val requiredThings = List("a", "b") 
} 

class ComplicatedCalculator extends SimpleCalculator with RequiredThings { 
    self: SimpleCalculator => 
    override val requiredThings:List[String] = List("c") ::: self.requiredThings 
} 

Bu versiyonda, benlik tipli bir açıklama kullanıyorum, ama tamamen olumlu değilim. Muhtemelen requiredThings'i bir yönteme çevirerek çalışmayı başarabileceğimi düşünüyorum, ama bunu bir alan olarak denemek isterim.

Son çözüm:

trait RequiredThings { 
    def requiredThings: Seq[String] 
} 

class SimpleCalculator with RequiredThings { 
    def requiredThings = List("a", "b") 
} 

class ComplicatedCalculator extends SimpleCalculator with RequiredThings { 
    override def requiredThings:List[String] = List("c") ::: super.requiredThings 
} 

cevap

7

Evet, kendinden türüyle "devralınan" yöntemlere yapılan süper çağrılar henüz uygulanmadı. Bu yakında değişecek (biraz). Bu arada, onun yerine miras kullanmalısın.

+0

Yaptığım şey bu. Soruyu kodumun son sürümü ile güncelledim. –

+0

"Bu biraz değişecek" biraz. " Kimsenin bu durumun değişeceğini söylediği posta listesinden hatırlamıyorum. Bana bu bilgiyi nereden aldığını gösterebilir misin? Teşekkürler. – Eric

+2

@Eric: Bu e-posta listesinde hiç yayınlanmış olup olmadığından emin değilim, ancak Scala takımındayım ve Martin böyle bir özelliği tamamladı. Bu arada başka şeylerle uğraştım ve önemsiz olmayan bazı uygulama sorunları var. –

3

Bu anlamda bir def olarak requiredThings olması için yapar en azından trait yılında - bu size verecektir daha fazla esneklik yeterince

+0

Bu çok anlam ifade ediyor. Çözümünde yaptım. –

4

Komik, aynı konuyla ilgili bastı dün.

Kendi türlerinin şu anda uygulanma şekli, bir yöntemi (veya değeri) geçersiz kılarsanız, geçersiz kılınan yönteme başvurmanın bir yolu yoktur.

şu şekilde döngü:

class A { def foo = "a" } 
trait B { self: A => override def foo = self.foo + "b" } 

(not: değil A Eğer super.foo diyemezsin, B üstüdür ScalaObject)

Ben de bir daha dolaylama ile çalıştı

, ancak program hala döngüler.

class A { def foo = "a"; def fooA = A.this.foo } 
trait B { this: A => override def foo = fooA + "b" } 

eser öz tipleri şu anda oluyor yoktur, belki bu değişecektir.

İlgili konular