4

プロパティを次のように宣言したいと思います。

IList<BaseNode and IComplexType> ComplexTypes { get; }

リスト内のすべての要素はBaseNodeを継承し、IComplexTypeを実装します。これを行う方法はありますか?リスト内のノードはすべてBaseNodeのサブクラスであるため、クラスBaseNodeComplexTypeを作成することはできません。

更新:私はこれを完全に説明するために考えていませんでした。XmlNodeなどのサブクラスがあります。XmlNodeはBaseNodeから継承します。XmlNodeを継承し、IComplexTypeを実装するXmlComplexNodeもあります。しかし、XmlNodeはIComplexTypeを継承しません(そして、場所で「obj is IComplexType」を使用するので、継承したくありません。これを最初に追加しなかったことをお詫びします。

4

5 に答える 5

11

いいえ、でもジェネリックで解決できますか?

class CustomObj<T> where T : BaseNode, IComplexType
{
   IList<T> ComplexTypes { get; }
}

使用されるジェネリック制約の詳細については、このページを参照してください。

于 2012-07-17T15:26:03.107 に答える
6

正しい動作はComplexBaseNode、継承された BaseNode 機能とインターフェイス IComplexType の両方を持つ新しいクラスを派生させることです。そうではないでしょうか?

于 2012-07-17T15:25:10.890 に答える
3

それを行う直接的な方法はありません。

しかし、ジェネリックを使用してそれを実現できます。ジェネリック型パラメーターはどうでしょうか。

public class YourClass<T> 
  where T : BaseNode, IComplexType

...そして、プロパティは次のようになります。

IList<T> ComplexTypes { get; }
于 2012-07-17T15:26:39.237 に答える
0

お住まいはどこですかIList<>xxx(タイトルからの)一般的なパラメーターを使用する場合は、 と言うことができますwhere xxx : BaseNode, IComplexType

おそらく抽象的に、BaseNodeすでに を実装できるかどうかも検討してください。IComplexType

于 2012-07-17T15:25:44.120 に答える
-1

の定義は IList<T>、リスト内の要素に対して 1 つのタイプのみを指定できることを意味します。

ComplexNodeContainer<T,U>T=BaseNode および U=IComplexType の場合、IComplexType も実装する BaseNode オブジェクトを含むコンテナー クラスを作成します。

「含まれる」オブジェクトを(できればコンストラクターで、またはメソッド/プロパティを介して)設定すると、両方のタイプを実装しているかどうかを確認し、それに応じて動作できます。

それを取得するための 2 つのプロパティを使用できます。1 つはタイプT(またはBaseNode)、もう 1 つはタイプU(またはIComplexTypeこの場合) です。

次に、プロパティを次のように定義できます。IList<ComplexNodeContainer>

于 2012-07-17T15:46:26.590 に答える