この方法では継承できません。Liskov Substitution Principleに違反しています。なぜそうなのかを説明します。これらのクラスをコンパイルできるとします。
class Person {
def doSomething[P<%Person](persons :List[P]) {
}
}
class Worker extends Person {
override def doSomething(persons: List[Worker]) {
}
}
さて、この単純なプログラムは失敗します:
val p1: Person = new Worker
val p2: Person = new Person
p1.doSomething(List(p2))
p2
は ではないため、Worker
その呼び出しは無効です。ただし、p1
は であるためPerson
、その呼び出しは有効です。この矛盾は、提案したオーバーライドの結果です。
しかし、それはそれよりも悪いです!これも機能しません:
p1.doSomething[Worker](List(p1))
現在、ワーカーのリストを渡しているにもかかわらず、 で期待されているように、 inが型パラメーターを想定していないp1
ため失敗します。ただし、型パラメーターを渡す必要があると宣言されたメソッド! 繰り返しますが、矛盾は提案したオーバーライドの結果です。doSomething
Worker
doSomething
Person
継承は一種のis-a関係であることを忘れないでください。Worker
が である場合、 が期待するすべての点で のように動作Person
する必要があります。そのような関係を作成したくない場合は、継承を使用しないでください。Person
Person