0

私は比較的単純なアプリを構築していますが、デザインのより良い実践について少し混乱しています。

メインクラス MClass があります。クラス Child1 と Chil2 は両方とも MClass から継承します。現在、別のクラス AClass があります。これは、Child1 または Child2 のいずれかから継承できますが、両方を同時に継承することはできません (これは、インターフェイスを介してのみ可能だと思います)。

このオプションの継承をいずれかのクラスから取得するにはどうすればよいですか?

クラス AChild1 と AChild2 もあり、どちらも AClass を継承しています。最終結果は次のようになります。

MClass:Child1:AClass:AChild1

MClass:Child2:AClass:AChild2

可能なオプションはこれら 2 つだけです。AClass とその子を単純に組み合わせる方が良いですか?

MClass:Child1:AClass1

MClass:Child2:AClass2

私はこれを行うことができますが、AClass1 と AClass2 には冗長なフィールドがたくさんあります...お勧めはありますか?

ありがとうございました!

編集:

具体的な状況は次のとおりです。

タイプ 1 またはタイプ 2 のいずれかの機器があります。クラス機器には多くのプロパティがあります。Type1 と Type2 には独自のプロパティがあり、Equipment を継承しています。Type1 と Type2 の両方にケーブルがあります。特定のプロパティを持つ Cable クラスがあります。さらに、Type1 と Type2 には異なるタイプのケーブル、CableType1 CableType2 があり、これらには固有のプロパティがあり、Type1 または Type2 からフィールドを継承します。

4

2 に答える 2

3

VB.NET は多重継承を許可しません。具体的なユースケースに応じて、さまざまなことができます。

  • クラス間の共通機能を interfaces に記述します。もちろん、すべてのクラスで機能を個別に実装する必要があり、フィールドでは役に立ちませんが、共有インターフェイスを使用して、機能を提供するすべてのクラスにアクセスできます。
  • あなたが提案したように、機能を子クラスに入れます。これは可能ですが、いくつかの重複フィールドを意味します。これで問題ない場合もあれば、そうでない場合もあります。
  • 機能を共通の基本クラスに入れ MClassます。繰り返しますが、これは具体的なシナリオによって異なります
  • 継承よりも構成を使用します。多重継承の必要性は、多くの場合、継承関係 ("is a") が誤用され、実際に合成 ("has a") を表現したい、不適切なクラス設計を示しています。これは、両方の子によって使用される別のクラスにフィールドやメソッドを配置することを意味します。単一責任の原則をガイダンスとして使用して、各クラスに明確に定義された責任が 1 つだけあるようにする必要があります。

残念ながら、あなたは具体的な例を示していないので、あなたの場合に何が最善かを言うのは難しいです. これらの手法を組み合わせることで、最良の結果が得られる可能性が非常に高くなります。

于 2013-03-20T19:41:24.780 に答える
1

誰かが既に述べたように、.NET は多重継承をサポートしていません。そうは言っても、クラス複数のインターフェイスを実装できます。または、インターフェイスは複数のインターフェイスを継承できます。これは、拡張メソッドと組み合わせて、実装を共有するための優れた方法を提供します。これは、ミックスインほど多重継承とは似ていませんが、効果はほぼ同じです。

インターフェースの観点からモデルを再考すると、多重継承に関して必要なことを行うことができます。実装クラスは単なる POCO であり、実装ロジックは拡張メソッドの形式の静的メソッドです。

カプセル化の場合、明示的なインターフェイスの実装を使用して実装クラスに特定のプロパティを実装できるため、クラス自体を操作するときに特定のプロパティが表示されなくなります。

この手法を使用すると、テスト容易性が大幅に向上し、多くの結合が防止されることがわかりました。

于 2013-03-20T20:10:09.980 に答える