因此,我定义了一个通用的“Dog”接口。客户需要实现该接口以创建具体的狗类型(例如拉布拉多、贵宾犬等),实例化并将它们加入我的狗舍应用程序(使用例如
kennel::admitDog(dog *dog)
)。以下是抽象的Dog基类:
class Dog {
public:
Dog()
{
}
virtual ~Dog()
{
}
virtual void eatFood() = 0;
virtual void takeBath() = 0;
virtual void play() = 0;
virtual void sleep() = 0;
};
我已发布了这个接口,我的客户已经开始使用它来创建他们自己的具体狗类型。在应用程序的下一个版本中,我计划支持狗舍中的机器狗。
问题来了。机器狗需要上面的抽象基类中的“Dog::rechargeBattery()”。而且,它不需要现有的“Dog::eatFood()”函数。将“Dog::rechargeBattery()”添加到上述抽象基类中会影响所有已经使用此接口的现有客户。他们将被强制实现“Dog::rechargeBattery()”并重新编译代码,这可能是不可取的。
1. 在这一点上的解决方案是什么? 2. 在最初的设计中,我应该做些什么以避免这个问题?
Dog
中移除eatFood
方法,并添加LiveDog
和RobotDog
派生的抽象类? - user2100815eatFood
将会影响现有的客户端。他们都将被迫实现LiveDog
。 - binary_baba