【问题标题】:Is it a good practice to inherit an interface from an base object?从基础对象继承接口是一种好习惯吗?
【发布时间】:2014-04-23 09:28:34
【问题描述】:

代码 sn-p 更好地解释了这个问题。这段代码sn-p可能编译不通过,但是很好解释问题。

从代码 sn-p 中,接口 INetworkAddressMonitor 类继承自 Observerable 以避免“将两个对象传递给其他组件”。

所以INetwworkAddressMonitor有两个责任,

  • 解耦。
  • 重用Observerable 代码。

这是一个好习惯吗?如果没有,如何处理?

template <typename IObserverT> class Observerable
{
public:
    virtual ~Observerable(){}
    virtual void addObserver(IObserverT* obj) { ... }
    virtual void removeObserver(IObserverT* obj) { ... }
private:
    ...
};

class INetworkAddressMonitorListener
{
public:
    virtual void onXXXX() = 0;
};

// We don't want to pass NetworkAddressMonitor to another object,
// so we define INetworkAddressMonitor.
// We inherit INetworkAddressMonitor from Observerable, to avoid 
// pass both Observerable object and INetworkAddressMonitor. 
// IS THIS AN GOOD PRACTICE?
class INetworkAddressMonitor: public Observerable<INetworkAddressMonitorListener>
{
public:
    virtual ~INetworkAddressMonitor() {};
    virtual void start() {};
    ... ...
};

class NetworkAddressMonitor: INetworkAddressMonitor
{
    ... ...
}

【问题讨论】:

  • 这取决于,您是否要通过基对象指针/引用与派生类进行交互?因为如果你是(并且虚函数建议你这样做),每个派生类都会有不同的基类型,这使得多态性成为不可能。如果这是您的计划,您可能需要一个非模板基类和一个中间 CRTP 类。
  • @user657267,我们将通过引用或指向 INetworkAddressMonitor 的指针来使用 NetworkAddressMonitor。
  • 我是 OP。我认为这个问题应该迁移到 Programmers Stack Exchange,它是关于软件设计的,应该在 Programmers 中得到一些回应。但是我无法将它迁移到程序员,它只是让我选择 sharpoint/dba/superuser,没有程序员,所以请你帮忙将它迁移到programmers.stackexchange.com/

标签: c++ oop design-patterns


【解决方案1】:

视情况而定。

如果您正在创建一个供各种客户端应用程序使用的对象,那么仅发布接口而不是整个对象可以提供有用的封装(信息隐藏)。

如果您有一组具有类似功能的对象,例如多个打印机驱动程序,然后使用通用接口使客户端应用程序可以更轻松地混合和匹配对象(例如不同的打印机),而无需为每个不同的对象使用自己的单独代码。

复杂的程序通常会为“附加组件”或“扩展”定义一个接口——例如图形程序的过滤器。然后,您可以设计自己的插件,并且程序可以利用其功能,而无需了解有关您的特定插件的任何具体信息。

在上述情况以及许多其他类似情况下,使用接口基类很有意义。在其他情况下,它可能不一定是一个好主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 2019-08-18
    • 2010-09-27
    • 2021-08-20
    • 2011-02-08
    • 2011-10-23
    • 2011-03-06
    相关资源
    最近更新 更多