6

私は単純なゲームを書いていますが、多くのゲームオブジェクトが属性を共有しています。これには2つの潜在的な実装があります。

1つ目は、次の画像で指定されている継承を使用することです。

クラス階層

ご想像のとおり、太字のクラスは抽象クラスです。ブランチは、実際に使用される派生クラスです。これらのクラスはオブジェクトに関するデータを保持し、それらに関連付けられた機能はないことに注意することが重要です。

たとえば、TroopとVehicleには、attack()やmove()などを実行するために使用する共通のインターフェイスがあります。上で概説したクラス階層は、単なる生の統計です。さらに、それらはすべて真のISA関係です。

2番目の実装は構成を使用します。上記のクラス階層の代わりに、各抽象クラスは代わりに特定のデータメンバーを保持する「モジュール」です。そのため、SpecialAbilityにはPointsValueObjectというデータメンバーがあります(ただし、モジュール/属性の性質を反映するために、抽象(抽象ではなくなりました)クラスの名前を変更しました)。また、Troopには、PointsValueObject、PhysicalObject、PhysicalAttackObject、およびBattleOBjectのデータメンバーがあり、それぞれが軍隊に関するデータを格納するモジュールです。繰り返しますが、これらのモジュールには機能がなく、データの保存にのみ使用されます。動作と機能は、引き続きインターフェイスクラスを介して実装されます。

私の質問はこれです:人々は一般的に継承よりも構成を好みますが、この場合、ISAの関係が成り立ち、階層には動作が含まれず、データのみが含まれるため、継承に固執する傾向があります。この階層は優れたOODですか、それとも属性'modules'を使用してクラスを構築する方が優れていますか?

4

1 に答える 1

4

再利用されているコードがない場合、継承を使用することでどのような利点がありますか?継承は、動作が同じである場合にDRY(Do n't Repeat Yourself)に役立ちますが、動作がないと、自分自身を制限する可能性があります。後で、必要なデータが少ないサブ階層があると判断した場合、適切な解決策はありません。それをしてくれて。

于 2013-02-17T19:55:23.773 に答える