これはばかげた質問かもしれませんが、私はこれを考えすぎていますが、次のような状況があります。抽象的な「クラス アクション」オブジェクトを実行できる「クラス シェル」を作成しています。これらのオブジェクトを作成または使用する必要がある唯一のクラスです。アクション オブジェクトは、特定のアクションを実行するためにシェルにアクセスする必要がありますが、このためにパブリック インターフェイスを追加することは避けようとしています (他の誰もそれを許可されるべきではありません)。
私はもともとシンプルでした(それほどエレガントではありません)
class Shell
{
public:
bool checkThing();
// etc...
private:
bool _thing;
};
class Action
{
public:
virtual void execute( Shell &s )=0;
};
class ChangeAction : public Action
{
public:
void execute( Shell &s )
{
// requires friendship or public mutator!
s._thing = true;
}
};
そこで、ネストされたクラス Action を検討しましたが、それを非公開にしたかったのです (シェル以外の具体的な Action を作成できるようにするのはなぜでしょうか?)
class Shell
{
public:
bool checkThing();
// etc...
private:
bool _thing;
class Action;
};
class Shell::Action
{
public:
virtual void execute( Shell &s )=0;
};
class ChangeAction : public Shell::Action
{
public:
void execute( Shell &s )
{
// ok now!
s._thing = true;
}
};
しかしもちろん、これ以上 Action から継承することはできません (これは理にかなっており、非公開です)。だからうまくいかない。
私の質問は、最初の方法と友情、またはパブリックインターフェイスを使用する必要がありますか? アクションおよびシェルとの関係を維持するために、2 番目の方法に似た方法を使用できますか? もっと良いアイデアはありますか?