私があなたの質問を読んで理解していることは次のとおりです。それぞれにエフェクトが関連付けられた複数のアイテムクラスがあります。 Itemオブジェクトのタイプに対応するエフェクトは、Characterである別のエンティティに適用されます。今度は、Characterクラスに変更があるたびにItemクラスも変更する必要があり、これを避けるためのよりきれいな方法が必要になります。
変更を処理する良い方法は、あまり変更されない明確に定義された契約を定義することです。たとえば、2つの整数を追加する機能があり、後で2つの浮動小数点数を追加する必要があるような変更があり、後で追加操作を乗算に置き換える必要がある場合があります。そのような場合、抽象計算Compute(INum num1、INum num2)を定義することができます。戻り値の型はINumです。ここでは、INumは型の抽象であり、Computeは関数の振る舞いの抽象です。実際の実装では、INumとComputeが定義されています。今私たちのコードを使用しているコードは、抽象に依存しており、ユーザーコードに影響を与えることなく、操作と実際のタイプを自由に変更できます。
契約を実装する際に、契約を使用して外部コードに影響を与えずに内部実装を変更することができます。
抽象クラスICharacterを定義できます。将来型が変更される可能性のある属性については、テンプレートとジェネリックを使用するか、単に属性型のインタフェースを作成して、具体的な型にインタフェースを実装させることができます。すべてのフィールドをインタフェースで参照してください。 ICharacterは、Interfaces型のパラメータを持つパブリック抽象メソッドを定義し、Intercepts型も返すようにします。
アイテムクラスにICharacterを使用させるアイテムクラスごとに効果を適用する必要がある場合は、定義された定数抽象関数を使用してください。キャラクターの内部修正は、アイテムクラスに影響を与えずに変更できるようになりました。
OOPデザインでは、 'Character'はそれ自身に変更を適用します。ロジックを 'Item'に分離し、データを' Character'に分離するのは、OOPではなく_procedural programming_です。 – jaco0646