代码片段可以更好地解释这个问题。这个代码片段可能无法通过编译,但它很好地解释了这个问题。
从代码片段中,接口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
{
... ...
}
这取决于情况。
如果您正在创建一个对象供各种客户端应用程序使用,那么只发布接口而不是整个对象就可以提供有用的封装(信息隐藏)。
如果您有一个具有类似功能的对象集合,例如多个打印机驱动程序,那么使用通用接口可以使客户端应用程序更容易地混合和匹配对象(例如不同的打印机),而不需要为每个不同的对象单独编码。
复杂程序通常为"附加组件"或"扩展"定义一个接口,例如图形程序的过滤器。然后,您可以设计自己的附加组件,程序可以在不知道有关特定附加组件的任何特定信息的情况下利用其功能。
在上述情况以及许多其他类似情况下,使用接口基类非常有意义。在其他情况下,这可能不一定是个好主意。