かなり頻繁に他のクラスから派生することを意図したクラスがいくつかあります。それらは、キーダウンレシーバー、キーリリースレシーバー、マウス移動レシーバーなどのユーザー入力レシーバーです。それらを継承するクラスには、たとえば、キー ダウン レシーバーおよびキー リリース レシーバーから継承する hotkey-action や、マウス ムーブ レシーバーから継承する camera-rotator があります。ユーザーが行う入力は、別のクラスによって対応するレシーバーに転送されるため、カメラ回転子などの入力レシーバーは、その転送クラスに自分自身を登録する必要があります。入力を転送するクラスは常に同じで、2 つになることはありません。
私のクラスのユーザーが、マウス移動レシーバーなどから継承するクラスである新しい入力レシーバーを作成する場合、マウス移動レシーバーは、マウス入力を受け取るためにそれ自体を登録するために、転送クラスを知る必要があります。したがって、マウス移動レシーバー コンストラクターのコードは次のようになります。
mouseMoveReceiverIF(inputforwarder* ifo)
{
ifo.registerInputReceiver(this);
}
inputforwarder が 1 つしかないことは明らかであるため、ユーザーがそれを渡す必要がある場合は直感的でなくなるだけでなく、作成された input-receiver ごとに追加の入力が必要になります。
しかし、inputforwarder をシングルトンまたはグローバル変数にして、ユーザーがコンストラクターで渡す必要なく入力レシーバーがそれにアクセスできるようにすると、他の問題が発生します。ユーザーはそれを知る必要がありました。 inputforwarder は、inputforwarder が作成される前に存在している必要があります。彼に警告するものは何もなく、最初にインプットフォワーダーを作成することを強制するものも何もありません。入力レシーバーが存在しない入力フォワーダーに登録しようとするため、プログラムは単純にクラッシュします。そして、それはさらに悪いことです。
効果的で適切な方法はどのように見えますか? 上記の例に代わるものは何ですか?
ありがとう!