初心者の質問があります。
interface Animal {
void partner(Animal other);
}
class Lion implements Animal {
int areaUnderControl;
@Override
public void partner(Animal other) {
Lion lion = (Lion) other;
this.areaUnderControl += lion.areaUnderControl;
}
}
class Human implements Animal {
int money;
@Override
public void partner(Animal other) {
Human human = (Human) other;
this.money += human.money;
}
}
具体的な実装のパートナーメソッドは、そのタイプまたはサブタイプのパラメーターのみを受け取るようにします。1つの解決策は、ジェネリックを使用して動物を次のように定義することです。
interface Animal<T extends Animal<T>> {
void partner(T other);
}
class Lion implements Animal<Lion> {
int areaUnderControl;
@Override
public void partner(Lion other) {
this.areaUnderControl += other.areaUnderControl;
}
}
class Human implements Animal<Human> {
int money;
@Override
public void partner(Human other) {
this.money += other.money;
}
}
ただし、誰かがこれを悪用する可能性があります
class Bear implements Animal<Lion> {
int honey;
@Override
public void partner(Lion other) {
this.honey += other.areaUnderControl; //Problem
}
}
クマがライオンとの提携を目指しているところです。これのタイプとサブタイプにそれを結び付けることができる方法はありますか
既存の質問を検索してみましたが、どういうわけかインターフェース自体のデザインに欠陥があるのではないかと思います。なぜこれが間違っているのか、またはこれを達成するための正しい方法を誰かが指摘できれば、それは大いにありがたいです。
ありがとう!