0

プロパティとしてクラス B のオブジェクトを含むクラス A があります。クラス B を派生させ、クラス A のプロパティが派生クラス オブジェクトを指していることを確認したいと考えています。そのためには、そのプロパティをオーバーロードするクラス A を派生させる必要があると思います。したがって、構造は次のとおりです。

public class A {
  public List<B> X{get; set;}
}

public class B {
}

public class C : B {
  string extraProperty {get; set;}
}

public class D : A {
     // I want property X to be of type C.
}

クラス A でプロパティ X を仮想として宣言してから、クラス D で X のオーバーライドを使用しようとしましたが、エラーが発生しD:X must be of type B to match overriden member A:Xます。C# はプロパティのオーバーロードをサポートしていないことを読みました。どうすればこれを行うことができますか?

編集: クラス A と B は別の場所で使用されているため、変更できません。

4

2 に答える 2

2

コメントで述べたように、これを行う方法はジェネリックを使用することです。

public class A<T> where T : B {
    public List<T> X { get; set; }
}

public class B {
}

public class C : B {
    string ExtraProperty { get; set; }
}

public class D : A<C> {
   // Property X is of type C.
}

public class E : A<B> {
   // Property X is of type B.
}
于 2013-06-27T23:06:45.713 に答える
1

まず第一に、a を読み取り/書き込みプロパティとして公開することは非常にまれです。時折、プロパティによって が公開されるのは、プロパティがリストの内容をカプセル化するのではなく、リストを識別する必要がList<T>ある場合のみです。IList<T>List<T>

あなたが本当にやりたいことは、プライベートリストまたは配列を保持し、IList<T>インターフェイス経由でアクセスできるラッパーオブジェクトを返すプロパティを持っていると思います。読み取り専用アクセスのみが許可され、基本クラスが のリストを保持し、BaseFootype のプロパティを持つIList<BaseFoo>場合、派生クラスは のコレクションを保持し、DerivedFooそのプロパティが を返すようにすることができIList<DefivedFoo>ます。派生クラスの参照を基本クラスの型にキャストし、プロパティを要求するコードはIList<BaseFoo>.

コレクションへの読み取り/書き込みアクセスが必要な場合、そのアプローチは実際には機能しないことに注意してください。コードが派生クラス オブジェクトを基本クラス オブジェクトにキャストすると、IList<BaseFoo>. そこへの書き込みが許可された場合、コレクションはDerivedFoo.

于 2013-06-27T23:19:56.053 に答える