派生 类 个派生特征
Derived classes derived traits
这是示意图:
Class B
有一些方法组 trait1
。
Class B1
和 C1
有相似的方法组 trait2
。
trait2
派生自 trait1
.
我如何实现它? 我打算将所有这些 trait
s 方法从主层次结构中移出到一些单独的层次结构中。然后从适当的特征中导出 B
、B1
和 C1
。但后来我意识到从 B
继承 B1
会有问题,因为 B1
也会有 trait1
。
现在我想我可以拥有一些类型的字段,比如 TraitBase
,并使用 trait1
或 trait2
类型的适当构造函数启动它。但是我不喜欢我应该有一个字段的想法,所以我的 class 有一些特殊的行为。可能有另一种解决方案吗?谢谢。
更新
我的意思是class B
有一些特征,是在B1
中派生出来的。 C1
应该具有 class B1
具有的特征。
class B
{
virtual foo1();
virtual foo2();
virtual trait_method1(); //implementation 1
virtual trait_method2(); //implementation 1
};
class B1 : public B
{
virtual foo1();
virtual foo2();
virtual trait_method1(); //implementation 2
virtual trait_method2(); //implementation 2
};
class C1 : public C
{
virtual bar1();
virtual bar2();
trait_method1(); //implementation 2
trait_method2(); //implementation 2
};
你的问题可能通过从 trait1 虚拟继承来解决:
class trait2 : virtual public trait1{}
class B : public A, virtual public trait1{}
class B1 : public B, public trait2{}
class C1 : public C, public trait2{}
然而,这种设计只有在 class trait1 是无状态的情况下才有意义。如果不是,请考虑不同的设计,也许是桥接模式。
这是示意图:
Class B
有一些方法组 trait1
。
Class B1
和 C1
有相似的方法组 trait2
。
trait2
派生自 trait1
.
我如何实现它? 我打算将所有这些 trait
s 方法从主层次结构中移出到一些单独的层次结构中。然后从适当的特征中导出 B
、B1
和 C1
。但后来我意识到从 B
继承 B1
会有问题,因为 B1
也会有 trait1
。
现在我想我可以拥有一些类型的字段,比如 TraitBase
,并使用 trait1
或 trait2
类型的适当构造函数启动它。但是我不喜欢我应该有一个字段的想法,所以我的 class 有一些特殊的行为。可能有另一种解决方案吗?谢谢。
更新
我的意思是class B
有一些特征,是在B1
中派生出来的。 C1
应该具有 class B1
具有的特征。
class B
{
virtual foo1();
virtual foo2();
virtual trait_method1(); //implementation 1
virtual trait_method2(); //implementation 1
};
class B1 : public B
{
virtual foo1();
virtual foo2();
virtual trait_method1(); //implementation 2
virtual trait_method2(); //implementation 2
};
class C1 : public C
{
virtual bar1();
virtual bar2();
trait_method1(); //implementation 2
trait_method2(); //implementation 2
};
你的问题可能通过从 trait1 虚拟继承来解决:
class trait2 : virtual public trait1{}
class B : public A, virtual public trait1{}
class B1 : public B, public trait2{}
class C1 : public C, public trait2{}
然而,这种设计只有在 class trait1 是无状态的情况下才有意义。如果不是,请考虑不同的设计,也许是桥接模式。