祝大家有美好的一天...
我正在我的公司从事一个复杂的项目,我在项目中使用了一些扭曲的工厂设计模式。省略细节;我有一些只能由“读者”创建的类(我称它们为“设备”):
class DeviceBase // this is a virtual base class
{
public:
//some stuff
friend class ReaderBase; // this is OK and necessary I guess?
private:
DeviceBase(); // cannot create a device directly
//some more stuff
}
class Device1: public DeviceBase // some extended device
{
public:
//some stuff
private:
//some more stuff
}
class Device2: public DeviceBase // some other extended device
{
public:
//some stuff
private:
//some more stuff
}
现在是“阅读器”,它恰好是设备的工厂:
class ReaderBase
{
private:
DeviceBase[] _devices; // to keep track of devices currently "latched"
public:
// some other methods, getters-setters etc ...
// this method will create the "Devices" :
virtual bool PollforDevice ( DeviceType, timeout) = 0;
}
现在,这是我的工厂课程;但它(如您所见)是纯虚拟的。我有特殊的读者继承自这个:
class InternalReader: public ReaderBase
{
public:
// define other inherited methods by specifics of this reader
bool PollforDevice( DeviceType dt, timeout ms)
{
switch(dt)
{
case Device1: { /* create new device1 and attach to this reader */ } break;
case Device2: { /* create new device2 and attach to this reader */ } break;
}
// show goes on and on...
}
}
class ExternalReader: public Reader
{
public:
// define other inherited methods by specifics of this reader
bool PollforDevice( DeviceType dt, timeout ms)
{
switch(dt)
{
case Device1: { /* create new device1 and attach to this reader */ } break;
case Device2: { /* create new device2 and attach to this reader */ } break;
}
// show goes on and on...
}
}
我使用这种模式的原因是:我正在为一个可以同时连接多个“阅读器”的系统编写代码,并且我必须同时使用它们。
还有这些“设备”:我也可以公开他们的构造函数,大家都会开心;但我想确保它们不是由代码编写者自己创建的(以确保它的其他编码者)
现在的问题:
- 我应该在每个“设备”中明确声明 ReaderBase 是朋友吗?或者仅仅在基础上声明“DeviceBase”就足够了?
- 我应该明确放入从“ReaderBase”继承的“Readers”也是这些设备的朋友的每个“Device”,还是只放入 ReaderBase 就足够了?
- 除了让整个“ReaderBase”类成为朋友之外,我可以(并且应该)让成员方法“PollforDevice”成为朋友吗?知道它是一个纯虚拟方法,那是否也会使继承的副本成为朋友?
很抱歉这个问题很长,但我只想说清楚。
提前致谢...