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面试题60 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法?