Cri*_*omo 5 c++ oop polymorphism inheritance
在一个项目中,我们的团队正在使用对象列表对数据集执行大规模操作,这些数据集应以类似的方式处理.特别地,理想情况下不同的对象将起到相同的作用,这将通过多态性非常容易地实现.我遇到的问题是继承意味着是一种关系,而不是一种关系.例如,有几个对象有一个损坏计数器,但为了使它易于在对象列表中使用,可以使用多态 - 除非这意味着一个关系是不正确的.(一个人不是破坏计数器.)
我能想到的唯一解决方案是让类的成员在隐式转换时返回正确的对象类型,而不是依赖继承.是不是更好的放弃是一个/有一个理想,以换取编程的简易性?
编辑:更具体地说,我正在使用C++,因此使用多态将允许不同的对象"行为相同",即派生类可以驻留在单个列表中并由基础的虚函数操作类.使用接口(或通过继承模仿它们)似乎是我愿意使用的解决方案.
我认为你应该实现接口,以便能够强制执行你的关系(我在C#中这样做):
public interface IDamageable
{
void AddDamage(int i);
int DamageCount {get;}
}
Run Code Online (Sandbox Code Playgroud)
您可以在对象中实现此功能:
public class Person : IDamageable
public class House : IDamageable
Run Code Online (Sandbox Code Playgroud)
并且你确定DamageCount属性并且有一种方法允许你增加伤害,而不是暗示一个人和一个房子在某种层面上彼此相关.
这可以使用多重继承来完成。在您的特定情况(C++)中,您可以使用纯虚拟类作为接口。这允许您拥有多重继承,而不会产生范围/歧义问题。例子:
class Damage {
virtual void addDamage(int d) = 0;
virtual int getDamage() = 0;
};
class Person : public virtual Damage {
void addDamage(int d) {
// ...
damage += d * 2;
}
int getDamage() {
return damage;
}
};
class Car : public virtual Damage {
void addDamage(int d) {
// ...
damage += d;
}
int getDamage() {
return damage;
}
};
Run Code Online (Sandbox Code Playgroud)
现在,Person 和 Car 都是“is-a”Damage,这意味着它们都实现了 Damage 接口。纯虚拟类的使用(因此它们就像接口)是关键,应该经常使用。它将未来的变化与整个系统的改变隔离开来。阅读开闭原则以获取更多信息。