我在一个业余爱好者游戏设计项目中使用SFML(简单快速媒体库),并遇到了一个令人讨厌的难题,使用sf :: Sprite,sf :: Drawable和克隆。问题在于:
作为复合和工厂设计模式的主要粉丝,我程序中的许多对象都包含指向抽象基础的成员,这些抽象基础可以是单个基元,也可以是sf :: Drawable的复合体。为了解决使用抽象对象进行复制构造/工厂创建的问题,我一直在使用类型协方差的形式克隆'从广泛使用的“Clonable”中继承的方法。基类。作为一个具体的例子,我创建了抽象类' Graphic'它代表一个可克隆的可绘制原语:
class Clonable{
public:
virtual Clonable* clone() const = 0;
};
class Graphic: public sf::Drawable, public Clonable{
public:
virtual Graphic* clone() const = 0;
// Derivatives define as: {return new MyClass(*this);}
};
有了这个,我设计了多个Graphic的复合材料,它们也是Clonable。问题是,我希望这些复合成员能够成为sf :: Sprite,它派生自sf :: Drawable。这会创建一个菱形,因为sf :: Sprite和Graphic都继承自sf :: Drawable。通常情况下,虚拟继承会受到拯救,但sf :: Sprite由SFML拥有,而不是我。
我考虑过编辑他们的源代码并重新编译库,但这感觉就像是屠杀。每当SMFL决定更新他们的库时,我都需要每次都破解并重新编译它们的源代码。
总结:当第一个派生类中的一个(或两个)是专有/不可访问时,如何解决钻石问题?
另一种可能的途径:你怎么能承诺c ++一个对象在没有多重继承的情况下满足多个要求(绘制和克隆)?
谢谢,
约旦
答案 0 :(得分:1)
每当我遇到继承问题时,我会考虑用组合替换它,这是向现有类添加行为的另一种有效方法。
class Graphic : public Clonable {
public:
const sf::Drawable& getDrawable() const { return *drawable; }
private:
sf::Drawable* drawble;
};
然后,Graphic是Clonable,但它也通过getDrawable()方法公开了一个可绘制的接口。