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