【发布时间】: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