【发布时间】:2015-10-21 20:24:25
【问题描述】:
我正在尝试提出一个面向对象的设计,但很难满足 Liskov 替换原则。这是一个说明性示例:
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);
}
};
如何执行以下操作:
- Animal 的每个子类都应允许设置食物偏好,而不会破坏 LSP
- 每个派生类动物的食物偏好是食物的一个子类
例如,如果有人扩展 Animal 以创建 MarineMammal,则食物偏好可能是 Fish(他们将通过扩展 Food 创建)。
【问题讨论】:
-
出于兴趣,您正在寻找的实际多态行为是什么?即客户端代码将针对基类调用哪些确切的方法?我问这个是因为我认为你冒着解决错误问题的风险。动物可能乍一看像一个遗传问题,但实际上它更可能是一个特征问题。
-
你说得对,我不是在寻找多态行为。我真正想要的是任何扩展
Animal来定义正确的setFoodPreference函数的人。当然我可以争辩说我想打电话给setFoodPreference。
标签: c++ oop virtual-functions