0

我正在开发一个 API,其中 A 类派生为 B 类。

如果 API 用户想在应用程序级别扩展 A 类和 B 类的功能,那么就会出现问题。

假设应用程序用户提出 AX 类扩展 A 类,BX 类扩展 B 类。在这种情况下,用户没有得到 BX 类的预期行为,因为 B 类的基类是 A 类而不是 AX 类。

想法:应用程序用户可以使用 B 类和 AX 类扩展 BX 类,但在这种情况下,我认为会有已知的菱形行为。

我想知道解决此问题的任何标准方法。

4

4 回答 4

1

你的问题有点含糊。无论如何,我建议您特别阅读C++ FAQ 25问题 25.5。问题 25.5 和 25.6 讨论了一些备选方案。

于 2012-06-07T03:48:03.617 回答
1

从模板参数继承的类也是一种选择。伪代码:

class A;

template<typename WhichA>
class B : public WhichA;

class AX : public A;

class BX : public B<AX>;
于 2012-06-07T03:51:29.933 回答
0

...但在这种情况下,我认为会有已知的钻石行为

所以有什么问题 ?virtual继承是为了解决这种菱形图案。
如果 的孩子A实际上是继承的,那么我认为没有任何问题,除非更改设计。

于 2012-06-07T03:49:14.633 回答
0
class InterfaceA;

class InterfaceB;

class A : public InterfaceA;

template<class AType>
class B_Template : public InterfaceB, public AType;

// Below is same as class B in example
// Users can use B as if it was class B
typedef B_Template<A> B;   

// User can extend A
class AX : A;

// User can extend B any way they want (you can't police this)
// but the way you wanted in the question was:
class BX : B_Template<AX>;   // Inherits of the extended AX

这解决了您的问题,但正如评论中指出的那样,您应该考虑依赖注入而不是继承。

此外,实际上并不需要 Interface 类,但它可以清楚地说明基类的契约是什么——即模板参数 AType 必须满足 InterfaceA

于 2012-06-07T04:51:28.937 回答