我正在研究多重繼承,並且我讀到它被認爲是糟糕的設計。刪除多重繼承
我創建了一個示例,其中多重繼承將是有用的,我還沒有找到一種方法來重寫它以刪除多重繼承。
此外,許多語言不支持多繼承,需要新的設計。
'動物'類實現了許多動物所做的事情。
'AquaticAnimal'類實現了有關水的一切。
'TerrestrialAnimal'類實現了陸上動物的一切。
'兩棲'類是爲動物創造的,它可以做任何'水生動物'和'陸生動物'都可以做的事情。
該應用程序需要在類:動物園,水瓶座,平原和兩棲類使用'兩棲'動物。
儘管虛擬繼承,鑽石問題仍然存在,因爲調用Amphibious.eat()將調用Animal.eat()兩次,並且會導致不一致的狀態。
它不是一種真正的編程語言,但它就像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