皆様、良い一日を…
私は自分の会社で複雑なプロジェクトに取り組んでおり、プロジェクトでいくつかのしわくちゃの工場設計パターンを使用しています。詳細は省略します。「リーダー」のみが作成できるいくつかのクラス(「デバイス」と呼びます)があります。
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」から継承された「リーダー」がこれらのデバイスのフレンドでもあるすべての「デバイス」を明示的に配置する必要がありますか、それとも ReaderBase を配置するだけで十分ですか?
- 「ReaderBase」クラス全体をフレンドにする代わりに、メンバー メソッド「PollforDevice」だけをフレンドにすることはできますか? それが純粋な仮想メソッドであることを知っていると、継承されたコピーも友達になりますか?
質問が非常に長くなって申し訳ありませんが、明確にしたいだけです。
前もって感謝します...