我想要拿出一个面向对象的设计,并有难以满足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