我想要拿出一個面向對象的設計,並有難以滿足Liskov替代原則。下面是一個說明性的例子:Liskov替代原則與多繼承heirachies
class Food
{
public:
virtual void printName() {
//......
}
};
class Fruit : public Food
{
};
class Meat : public Food
{
};
class Animal
{
public:
Food *_preferredFood;
virtual void setFoodPreference(Food *food)=0;
};
class Carnivore: public Animal
{
public:
void setFoodPreference(Food *food) {
this->_preferredFood = dynamic_cast<Meat *>(food);
}
};
class Herbivore: public Animal
{
public:
void setFoodPreference(Food *food) {
this->_preferredFood = dynamic_cast<Fruit *>(food);
}
};
我怎麼能執行以下操作:
- 動物的每個子類都應該允許設置食物偏好,而不會破壞LSP
- 食物偏愛每個派生類動物是食物的一個子類
前面的例子,如果有人延伸Animal
創建MarineMammal
,foo d偏好可能是Fish
(他們將通過延伸Food
創建)。
出於興趣,您正在尋找的實際多態行爲是什麼?即客戶端代碼將針對基類調用什麼確切的方法?我問這是因爲我認爲你冒險解決錯誤的問題。動物可能會乍看起來像繼承問題,但它更可能是現實中的一個特徵問題。 –
你說得對,我不是在尋找多態行爲。我真正想要的是任何擴展「Animal」的人來定義正確的「setFoodPreference」函數。當然,我可以爭辯說我想調用''setFoodPreference''。 – SPMP