接口/抽象类应该只包含纯虚拟方法
Should interface/abstract class contains only pure virtual methods?
我在设计方面有点薄弱,我想知道在接口中使用简单的虚拟方法(不仅仅是纯虚拟方法)是否是一个好的设计?我有一个类是某种接口:
class IModel {
void initialize(...);
void render(...);
int getVertexCount() const;
int getAnotherField() const;
};
initialize和render方法肯定需要重新实现,因此它们是纯虚拟方法的好候选者。然而,最后两种方法非常简单,而且实际上总是具有相同的实现(只是返回一些字段)。我可以把它们作为默认实现的虚拟方法吗?还是因为它是一个接口,所以最好让它成为需要重新实现的纯虚拟方法?
我们必须指出一些差异:
没有"某种接口"这样的东西,这个类应该是接口还是抽象类?
如果它应该是一个接口,那么答案是:它的所有方法都必须是纯虚拟(无实现),并且它必须不包含字段,甚至一个字段都不包含。正如jaunchopanza所说,你能(实际上必须)做的最多的事情就是给虚拟析构函数一个空体,从而允许相应地析构函数派生类。
相反,如果它应该是一个抽象类,那么您可以随意添加字段m_vertexCount
和m_anotherField
(我想),并实现getVertexCount()
和՝getAnotherField()\1373。但是,您不应该将其命名为IModel
,因为I
前缀应该仅用于接口。
编辑:我想我是Bo Persson所说的"信徒"之一:)
您正面临代码重复性和可读性之间的权衡。代码的读者将从每个纯接口和每个非重写方法中获得良好的帮助。然而,默认实现将被每个子类复制。您是否应该提供默认实现取决于默认实现发生更改的可能性,然后需要在所有地方进行更改。
如果不了解这些细节,就无法给出一个明确的"是"或"否"的答案。
您可以做的一件事是使IModel
成为一个接口并提供基类,例如实现公共/重复功能的ModelBase
。
class IModel
{
virtual void initialize(...) = 0;
virtual void render(...) = 0
virtual int getVertexCount() const = 0;
virtual int getAnotherField() const = 0;
};
class ModelBase : public IModel
{
// common functions
virtual int getVertexCount() const override { return vertexCount_; }
virtual int getAnotherField() const override { return anotherField_; }
protected:
int vertexCount_ = 0, anotherField_ = 0;
};
class MyModel : public ModelBase
{
virtual void initialize(...) override { ... }
virtual void render(...) override { ... }
};
这种方法的一个缺点是,由于额外的虚拟函数和编译器的优化损失,会有一些(可能可以忽略不计)性能损失。
- 如何在C++中获得"静态纯虚拟"功能?
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 纯虚拟类和错误未定义对 'vtable 的引用
- C++:从抽象类重写纯虚拟运算符重载
- 让编译器告诉什么确切的纯虚拟方法使结构抽象?
- 用纯虚拟函数兜圈子
- 从纯虚拟类 (A) 派生的指针无法访问来自纯类 (B) 的重载方法
- 为什么调用没有正文的纯虚拟方法不会导致链接器错误?
- 用非纯虚拟版本重载纯虚函数
- 派生类中纯虚拟基方法的专业化
- googletest:测试基类具有纯虚拟方法的派生类时的核心转储
- 对静态分配的子类对象进行静态分配的纯虚拟父类引用是否合法?
- c++ 使用 CRTP 为变量模板中的每个类型创建纯虚拟重载
- 用c++中的纯虚拟方法抽象模板类
- 返回纯虚拟基类的向量的元素
- 纯虚拟函数
- 如何扩展/组合包含纯虚拟函数的接口类
- 在纯虚拟类中包含头文件
- 接口/抽象类应该只包含纯虚拟方法