假设我有一个具有多个类的应用程序(使用了继承) 现在有一天,我必须为我的应用程序添加新规范,这需要我使用多重继承。
例如此代码:
class A{};
class B : public A{};
class C : public A{};
现在我的新功能要求我这样做:
class D{} : public B,public C{};
但这会导致钻石问题。
所以我的问题是,如何克服这个问题: 1)作为一种最佳实践,我将对所有类使用虚拟继承,假设我将来可能需要使用多重继承? 要么 2)我只需更改我的代码,在需要时使我的基类成为虚拟的吗?
答案 0 :(得分:1)
解决此问题的一个好方法是将您尝试从类中获取的行为分离为组件。
现在你有这样的情况
users = User.all
users.each do |user|
if user.posts.any? && user.posts.count > 20
user.posts.where('created_at < ?', 30.days.ago).delete_all(:delete_all)
end
end
解决此问题的一种(可能是坏的)方法是从B或C扩展,然后只需从另一方复制所需的行为,但这是重复的代码。
您可以做的是将您的行为转化为组件:
class A {}
class B : public A {some behavior X}
class C : public A {some behavior Y}
class D : public ? {I need X and Y plus some behavior Z}
这将是一个我们称之为接口的纯虚拟类。然后你可以这样做:
class Behavior {void behave() = 0}
这将允许您创建从A扩展的新类,但您可以选择他们拥有的行为:
class BehaviorX : public Behavior {void behave(){behavior x}}
class BehaviorY : public Behavior {void behave(){behavior y}}
class BehaviorZ : public Behavior {void behave(){behavior z}}
如果你真的想把组件建模提升到一个新的水平,那么你就可以完全放弃制作儿童课程,只需使用A类作为组件包就可以使用你可以想到的任意数量的行为,然后就可以了只需在你想要的地方创建新的“类”,只有你想要的行为:
class D : public A {BehaviorX, BehaviorY, BehaviorZ, ...}