空的重写方法是接口设计不好的标志吗
Are empty overridden methods a sign of bad interface design?
我想知道从抽象接口类继承的空重写方法是否是糟糕接口设计的标志。有时,接口包含的方法只对所有可能的实现类部分有用;在不需要未使用的方法的类中,它们只是留空。
在下面的示例中,connect()
和disconnect()
对于两个实现类IpConnection
和SmtpConnection
是公共的。然而,prepare()
在SmtpConnection
中不是必需的,并且是空的。
在这种情况下,是从抽象接口IConnection
中删除prepare()
并显式调用它更好,还是将其留空?如果空的(未使用的(方法越来越多怎么办?
#include <memory>
class IConnection
{
public:
virtual void connect() = 0; /* common */
virtual void disconnect() = 0; /* common */
virtual void prepare() = 0; /* partial */
};
class IpConnection : public IConnection
{
public:
void connect() override { /* ... */ }
void disconnect() override { /* ... */ }
void prepare() override { /* ... */ }
};
class SmtpConnection : public IConnection
{
public:
void connect() override { /* ... */ }
void disconnect() override { /* ... */ }
void prepare() override { } /* empty */
};
int main()
{
std::unique_ptr<IConnection> connection;
connection = std::make_unique<SmtpConnection>();
connection->connect();
connection->prepare();
connection->disconnect();
}
接口是两个模块之间的一种"契约"类型。通常,接口指定如何允许另一个模块使用实现模块实例的功能。
因此,实际上接口与实现本身没有任何关系。它只是列出了规则,可能是一些诱导流约束和保护条款,任何实施都必须遵守这些规则和条款才能提供功能性实施。
因此,如果接口需要用一个空的主体来覆盖,那就完全可以了。其他实现可能非常需要工作。当然,如果知道这是永远不会发生的,那么最好不要在这一点上过度设计,只需删除接口调用。
在你的情况下,我不会太担心,把它作为一个界面。只有当重写方法非常特定于该实现的流,并且对其他实现不太有用时,直接调用功能才有意义。
相关文章:
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- Visual C++GC接口如何启用它以及要包含哪个库
- Windows.h与GLFW.h的接口
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 提供与TMP和SFINAE的通用接口
- 为重写std::exception的库生成swig接口时出错
- 内联如何影响模块接口中的成员函数
- 即使使用调试编译标志,表达式也是"optimized out"
- 在 CMake 中为每个目标设置编译器/链接器标志
- COM 接口 c# 封送数组数组
- 如何在 SCIP C++ 接口中获取 MILP 约束矩阵中的系数值
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 如何绑定 C++ gRPC 客户端的网络接口
- File.cpp.o:OpenPose 标志 CMakeFiles/.. 的多重定义/main.cpp.o:首先在这里定
- 模板化接口 - 创建一个泛型模板类以返回任何容器
- 如何从实现接口的模板化类实例访问结构
- 在轮班操作后使用携带标志
- 如何找出引入AVX标志的内容
- 带有进度表的 curl 多接口程序
- CMake:替换接口目标的编译标志