3

次のような状況があります。

public interface I {}
public class D1 : I {}
public class D2 : I {}

public class A
{
    public List<D1> Collection {get;set;}
    //Other Members
}
public class B
{
    public List<D2> Collection {get;set;}
    //Other Members
}

したがって、A と B の両方に、I から派生した要素を持つ List があります。

A と B の基本クラスを定義するにはどうすればよいですか?

PS I 基本クラスを一般化しようとしました:

class Base<T> where T : I
{
   List<T> Collection {get;set;}
}
A:Base<D1>{..}; B:Base<D2> {..}

しかし、それは私に何も与えません(または私はそう思うだけです):私はそうすることができません:

Base<I> b; b= new A(); b= new B();

からにキャストすることは不可能であるList<I>ためList<D1>

ありがとう

4

1 に答える 1

2

考えてみれば、それは理にかなっています。

このことを考慮:

Base<I> b = new B();
b.List.Add(new D1);

理論的には、それは有効なコードです。Base<I>.ListですList<I>D1から継承しIます。List<D2>しかし、List が実際に (で定義されているように)であることはわかっていBます。したがって、Add の呼び出しは機能しない可能性があります。

コレクションにアイテムを実際に追加する必要がない場合は、いくつかのことを切り替えて機能させることができます。

public interface IBase<out T> where T : I
{
    IEnumerable<T> Collection { get; }
}

public class A : IBase<D1>
{
    IEnumerable<D1> Collection { get; private set; }

    public A(IEnumerable<D1> list)
    {
        Collection = list;
    }
}

public class B : IBase<D2>
{
    IEnumerable<D2> Collection { get; private set; }

    public B(IEnumerable<D2> list)
    {
        Collection = list;
    }
}
于 2013-03-14T15:59:20.627 に答える