2012-04-17 21 views
6

Bir alt sınıf tarafından geçersiz kılındığında, temel yöntemleri aynı belirli alt sınıf örneğinde almak için nasıl zorlayabilirim?Alt sınıf yöntemleri alt sınıf argümanlarla geçersiz kılınır mı?

yani .:

abstract class Animal { 
    def mateWith(that: Animal) 
} 

class Cow extends Animal { 
    override def mateWith...? 
} 

Mantıken bir Cow sadece mateWith başka Cow gerekir. Ancak, override def mateWith(that: Cow) yaparsam, bu aslında temel sınıf yöntemini geçersiz kılmaz (alt sınıftaki varlığını güçlendirmek istediğim için).

Diğer örneğin İnek türüne sahip olduğundan emin olup olmadığını kontrol edebilir ve değilse bir istisna atar - bu en iyi seçeneğim mi? Ya daha fazla hayvanım varsa? İstisna atma kodunu tekrarlamak zorundayım.

cevap

11
abstract class Animal[T <: Animal[T]] { 
    def mateWith(that: T) 
} 

class Cow extends Animal[Cow] { 
    override def mateWith(that: Cow) { println("cow") } 
} 

class Dog extends Animal[Dog] { 
    override def mateWith(that: Dog) { println("dog") } 
} 

Ve bu gibi kullanmak:

scala> (new Cow).mateWith(new Cow) 
cow 

scala> (new Cow).mateWith(new Dog) 
<console>:17: error: type mismatch; 
found : Dog 
required: Cow 
       (new Cow).mateWith(new Dog) 
           ^

gerekli İstisna yok atma kod; tip sistem derleme zamanında sizin için işliyor!

+1

Tatlı anlaşma, Scala heck gibi uygun! –

+1

"Uygun" hakkında çok emin değilim, ama bu kadar etkileyici. –

+1

Bunu tekrar düşünürdüm - bu [f-sınırlı-polimorfizm] olarak bilinir (https://twitter.github.io/scala_school/advanced-types.html#fbounded). –

İlgili konular