2

お前らが暴れ始める前に、ここに来い。はい、実際には友情が継承されないように意図されていることを認識しています。それに似たものを取得する方法を見つけようとしています. これが私の状況です(実際のコードはなく、理論のみです)。私は単純な抽象ゲーム エンジン フレームワークに取り組んでいます。最初は、オブジェクト型を分割する単純なオブジェクト指向/継承アプローチを行うつもりでした。さて、紙の上では、エンティティを取り、それらを物理、アニメーション、不動のシナリオ、およびそのすべてのサブカテゴリのサブカテゴリに分割することは、非常に素晴らしいように聞こえました。しかし、これは危険であり、まったく異なるオブジェクトの混乱と、コンパイラーの代わりに強制する必要があるものを見逃すと簡単に問題を引き起こす可能性のあるかなりの危険なキャストで作業するのが困難になりました。

そこで、オブジェクトを抽象的に表現する別の方法を提案します。すべてのエンティティの派生元であるエンティティ クラスが 1 つ存在することを望みます。このエンティティ クラスには、ベクトル、またはその他の動的に拡張可能な最も効果的な配列が含まれます。これには、ビヘイビアと呼ばれるオブジェクトが含まれます。ビヘイビアーは指定された時間が経過すると更新され、指定されたオブジェクトのメンバーに影響を与えます。下記は用例です。

class Force : behavior;               
/*this would be a force, added to the behavior list and apply a constant 
acceleration vector to the object until removed from the behavior list. (or
it's lifetime is exhausted) */

class attackThought : behavior;  
/* For an ai, this would change how it reacts to a scenario by replacing or
even adding actions that it should perform given the change in position
or environment at update.*/

class animation : behavior;
/* You could create an animation, specify the animation that it is to perform, 
add it to the behavior list, and during the time update, it will adjust the 
vertex buffer accordingly, removing itself from the list when the animation
is done */ 

問題は、エンティティ オブジェクトのプライベート メンバー (オブジェクトの頂点バッファーなど) をほとんど変更するさまざまな方法で仮想関数の一部を実装する基本動作クラスから派生させたいことです。基本的なエンティティ コードをあまり操作する必要がないようにして、(ほとんどの場合) 他のオブジェクトと同様に処理できるようにしたいのですが、それらの動作を完全に操作/派生可能にしたいだけです。このシステムを C++ で動作させる方法を誰か考えてくれませんか?

ところで、友情という意味で、私はプライベートメンバーに影響を与える可能性のある派生エンティティクラスと友達になる基本クラスの動作を意味します。たとえば、エンティティから派生するモデル クラスがあり、アニメーションと呼ばれる動作の派生クラスをフレンドシップし、その後何らかの理由でクラスをモデルからより具体的なタイプのオブジェクトに派生させたいとします。アニメーション オブジェクトは、この新しいモデル派生オブジェクトのプライベート メンバーを操作します。

それともできますか?このアプローチがどれほど実行可能かについての意見も歓迎します (実際に批判が含まれている限り)。

4

1 に答える 1

2

私は何年にもわたって、友情とそれがカプセル化にどのように影響するかについて2つの異なる視点があることを見てきました:

  • メンバーをすべての人に公開するのではなく、制御されたエンティティのサブセットのみがアクセスできるようにすることで、カプセル化を改善するのに役立ちます。
  • オブジェクトは自己完結型であり、その内部部分を変更する唯一のエンティティである必要があるなどの明白な古典的な理由で、カプセル化を減らします。

私は友情を使うことを避け、それを回避しようとする傾向があります. プライベートにするだけでなく、クラスのユーザーに影響を与えずに内部で実装する方法を変更できるようにするために、すべてをカプセル化することを好みます。基本クラスで派生クラスの属性を変更できるようにする場合は、テンプレート メソッドデザイン パターンの使用を検討できます。これにより、基本クラスは派生クラスでメソッドの呼び出しを調整し、基本クラスで定義された汎用の抽象操作メソッドを確実に持つようにします。

クラスのすべての属性を「万が一に備えて」公開することについては (非常に危険に聞こえます)、すべてを非公開にすることから始めて、必要に応じて個々の属性を公開することを検討する方がよいと思います。

于 2012-05-29T07:37:27.923 に答える