具有子类的类的纯接口

Pure interface of a class with subclasses

本文关键字:接口 子类      更新时间:2023-10-16

让我们假设您想要创建Derived类的接口,它看起来像这样:

class Derived : public Base
{
   public:
      foo();
}
class Base
{
   public:
      tii();
      //many other methods
}

你会怎么做界面?如何使Base::tii对这个新接口可见(以及其他方法)?

class IDerived
{
   public:
      virtual foo() = 0;
      // should I declare here tii() as a pure virtual function?
      // but by doing it now there is ambiguity!
}

什么是好的策略?

新的派生类应该是这样的。。。。

class Derived : public Base, public IDerived
{
    //implement the real thing    
}

您的示例是向后做的:接口应该独立于任何具有所有纯虚拟方法的具体类来定义:

class IDerived
{
   public:
      virtual void foo() = 0;
      virtual ~IDerived() {} // don't forget to include a virtual destructor
}

具体的类将从接口公开派生:

class Derived : public Base, public IDerived
{
   public:
      void foo();
}

如果您希望IDerived也声明DerivedBase继承的方法,您可以通过调用继承的实现来让Derived显式地实现该方法:

class Derived : public Base, public IDerived
{
   public:
      void foo();
      void bar() { Base::bar(); } 
}

在前面,我不喜欢接口(它们是由c++以外的其他语言开发的)。无论如何,如果你有一个,它应该是完整的:因此,把"tii()作为一个纯虚拟函数"。若要解决冲突,请在"Derived"中重写该函数(转发到Base::tii)。