1

場合によっては、特定のタイプのオブジェクトが特定のタイプの動作をサポートすることを示すインターフェイスを発明します。たとえば、 と の両方DogにインターフェイスScaryDogがありMeleeAttackerます。

ここに画像の説明を入力

しかし、MeleeAttacker*ある関数にa を渡すとします。

void Attack( MeleeAttacker* attacker, Living *victim ) ;

MeleeAttackerは階層から分離されているため、 のバイタルアクセスできattackerませLivingattackerattackerLiving。階層をどのように構築したかにより、が常に共通クラスの継承者になることがわかっています。しかし、コードはそれを知りません。私の質問は、どうすればコードにそれを伝えることができますか?MeleeAttackersWarmBlooded

インターフェイスを導入することで物事を混乱させただけだと思いますが、階層の一部のブランチで実装されない関数でMeleeAttacker基本クラスを混雑させたくありませんでしWarmBloodedた (たとえば、 aBirdの近接攻撃の「実装」攻撃かもしれません{}何もありません))。

4

1 に答える 1

1

Living *引数をusingに単純にキャストしてみませんdyanmic_castか? 前者が実装されるときはいつでも後者を実装する具象クラスのおかげでそれを保証するので、それが起こることを知っています。

基本的にアイデアは のようなものqueryInterfaceですが、キャストが機能することがわかってCOMいるため、実際queryInterfaceに各クラスで自分自身を実装する必要はなく、呼び出しコードで適切な処理を実装する必要はありません。繰り返しますが、キャストが成功することがわかります。

于 2013-09-13T21:43:22.750 に答える