C ++接口类继承自具体类是否合理?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++接口类继承自具体类是否合理?相关的知识,希望对你有一定的参考价值。

在C ++中,接口类是否继承自具体类是否合理?这是一种糟糕的味道吗?

我有一个定义行为的接口,以及一个定义实现的继承类。

现在我有另一个类,我想声明“从这个类继承的人需要指定行为X,并定义此行为Y,其中alread具有有效的默认实现”。

这种实施是否正确?我对这种抽象/混凝土混合感到困惑。

class IBase
{
public:
   virtual ~IBase(){}

   virtual void method1() = 0;
}

class ConcreteBase : IBase
{
public:
  ConcreteBase(){}

  void method1() override { // some impl; }
}

class ISpecialized : ConcreteBase
{
public:
   // Here I don't need virtual destructor

   void method2() = 0;
}

class ConcreteSpecialized : ISpecialized
{
public:
   ConcreteSpecialized(){}

   void method2() override { // some impl. }
}
答案

而不是让ISpecialized扩展IBase,你应该考虑让它独立。然后,您可以使用多重继承来使您的具体类派生自两个接口。

class ISpecialized
{
public:
   ~ISpecialized(){}

   void method2() = 0;
}

class ConcreteSpecialized : ConcreteBase, ISpecialized
{
public:
   ConcreteSpecialized(){}

   void method2() override { // some impl. }
}
另一答案

语言允许它,它是明确的和重点,你可以使用override注释,它将帮助你,如果你重构另一种方法。我会考虑重命名ISpecialized,如果你使用I指定一个接口。

所以除了不必要的~IBase(){}之外,你的方法完全没有错。

如果你想要一个virtual析构函数然后使用

virtual ~IBase() = default;

即不要明确定义它。

另一答案

从软件设计的角度来看,我不建议这么做。

继承自ISpecialized而不是ConcreteBase类的IBase没有额外的好处,因为在这两种情况下,接口将定义完全相同的方法集。接口是您期望抽象的东西。

如果两个接口之间没有直接关系,我也建议考虑Mark的答案。在这种情况下,最好将它们分开,从而允许自己继承第一个的具体实现,同时仅使用另一个的定义。

以上是关于C ++接口类继承自具体类是否合理?的主要内容,如果未能解决你的问题,请参考以下文章

15接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concreteclass)?抽象类中是否可以有静态的main方法?

Java自定义接口,抽象类的父类都是Object吗?

Java面试题60 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法?

静态代码块类的继承和接口

第三章:继承/抽象类/接口

是否扩展接口,何时基类已经扩展了相同的接口