私は多重継承を研究していますが、それは悪い設計とみなされています。複数の継承を削除する
私は、多重継承が便利な例を作成しましたが、複数の継承を削除するためにそれを書き直す方法が見つかりませんでした。
さらに、多くの言語は多重継承をサポートしておらず、新しい設計が必要です。
「動物」クラスは、すべての動物が行う多くのことを実装しています。
'AquaticAnimal'クラスは水に関するすべてを実装します。
'TerrestrialAnimal'クラスは、土地の動物に関するすべてを実装します。
'Amphibious'クラスは、 'AquaticAnimal'と 'TerrestrialAnimal'でできることすべてを行うことができる動物用に作成されました。
このアプリケーションでは、動物園、水瓶座、平野、水陸両生類の陸上で「水陸両用」動物を使用する必要があります。
Amphibious.eat()を呼び出すとAnimal.eat()が2回呼び出され、矛盾した状態になるため、仮想継承にもかかわらず、ダイヤモンドの問題は継続します。
実際のプログラミング言語ではありませんが、Java/C++と似ています。
class Animal{
private:
Place birthplace;
String name;
List likesToEat;
Stomach stomach;
public:
virtual void growl(){ ... }
virtual int eat(Food food){
... test if likes
... many operations
chew()
...
stomach.fill(food);
}
}
class FlyingAnimal extends Animal {
private:
Wings wings;
public:
void fly(){ ... wings.move(); ... }
}
class AquaticAnimal extends Animal{
private:
Flipper flipper;
public:
void swim(){ ... flipper.move(); ... }
int eat(Food food){
int x = Animal.eat(food);
... use x
flipper.nourish(food);
}
}
class TerrestrialAnimal extends Animal{
private:
Legs legs;
public:
void run(){ ... legs.move(); ... }
int eat(Food food){
int x = Animal.eat(food);
... use x
legs.nourish(food);
}
}
class Amphibious extends AquaticAnimal, TerrestrialAnimal{
public:
int eat(Food food){
AquaticAnimal.eat(food);
TerrestrialAnimal.eat(food);
//PROBLEM: Animal.eat() will be called twice.
}
}
//------------------------------------------
class Zoo {
public:
void add/remove(Animal a);
void feed(Animal a);
void show(Animal a);
}
class Aquarius {
public:
void add/remove(AquaticAnimal a);
}
class Plains {
public:
void add/remove(TerrestrialAnimal a);
}
class HighPeaks {
public:
void add/remove(FlyingAnimal a);
}
class AmphibiousRace {
public:
void add/remove(Amphibious a);
void enterIntoLake(Amphibious a);
void exitFromLake(Amphibious a);
}
これには疑問符もありません。質問がありますか、これはちょうど脳のダンプですか? –
質問:複数の継承を削除するためにこのコードを書き直すにはどうすればいいですか? – Squall