2016-05-27 3 views
2

私は2つのクラスを持っています。 ClassAはClassBを使用します。私は任意のClassBオブジェクトのリスト(つまり、ClassB、ClassB両方を同じリストに格納することができるようにしたい)。継承されるタイプのプロパティ/メソッドの新しいバージョンへのアクセス

Iは、(簡略化)ようなので、これを実装している:

ClassB 
{ 
    public object Thing {get; set;} 
    AssignThing(object thing) {Thing = thing;} 
} 

ClassB<T> : ClassB 
{ 
    ... 
} 

ClassA 
{ 
    public List<ClassB> list {get; set;} 
    ... 
} 

静止することができるながらしかし、私は、Tが何であるかに基づいて、ClassBのは、その天然型Tとしてシングを格納できるようにしたいと思いそのClassBにキャストせずに、リストからClassAのT ThingとT AssignThingにアクセスします。私はにClassAからシングにアクセスすると、それはClassBのシングのバージョンではなく、ClassB<T>年代を見なければ(クイックウォッチを経由して)表示され、しかし

ClassB<T> : ClassB 
{ 
    public new T Thing {get; set;} 
    AssignThing(T thing) {Thing = thing;} 
} 

、私は当初、ClassBのための次の実装を試してみましたAssignThingClassBのバージョンも使用しています。明らかに、私は異なるシグニチャーであるため、(新しいものではなく)オーバーライドできません。

私は相続性/多型性について少しばかり思っています。私はC#で可能なことをしようとしていますか?

+0

'new'プロパティはprivateです。そのクラスだけがそのプロパティを使用できます。基本クラスから継承したプロパティを実際に隠すことはできません。そのため、他のクラスやそれ以上の派生クラスがその名前のプロパティにアクセスしようとすると、基本クラスから継承したプロパティのみが表示されます。 'new'は非常に特定のシナリオでのみ有用ですが、使用すべき解決策はほとんどありません。なぜあなたがそれを代わりに使用したいのかを教えてくれたら、誰かが 'new'を使うよりもうまくやる方法を教えてくれるかもしれません。 –

+0

私はコードのパターンに従った例を作成していましたが、疲れていました。それを指摘してくれてありがとう、それは問題ではありません。私はその例を修正した。 – Travis

+0

[mcve]を作成します。 –

答えて

0

ClassBだけでなく、ClassBのリストを作成する必要があります。

class ClassB 
{ 
    private object Thing {get; set;} 
    public void AssignThing(object thing) {Thing = thing;} 
} 

class ClassB<T>:ClassB 
{ 
    private T Thing { get; set; } 
    public void AssignThing(T thing) { Thing = thing; } 
} 

class ClassA 
{ 
    public List<ClassB<String>> list = new List<ClassB<String>>(); 
    public ClassA() 
    { 
     list.Add(new ClassB<String>()); 
     //Here you only can add ClassB<String>, not ClassB 
    } 
} 

もう1つのオプションは、diferendという名前です。同じ名前を持つ必要がない場合は、ClassBをGenClassBのように呼び出します。

+0

残念ながら、このアプローチでは、ClassB とClassB を同じリストに保つことはできません。 – Travis

関連する問題