2009-07-30 22 views
0

私はFooという名前のクラスを持っています。このクラスにはFooChildBase型の子オブジェクトのコレクションが含まれていますが、FooChildBaseを継承するFooChildTwo型のクラスもあります。オブジェクトと子コレクションの拡張?

Class Foo 
    Public Children As IList(Of FooChildBase) 
End Class 

Class FooChildBase 
    Public Info As String 
End Class 

Class FooChildTwo 
    Inherits FooChildBase 

    Public ExtraInfo As String 
End Class 

これはすべて正常に動作します。今私は特別な情報を持つ私のFooオブジェクトの特殊化を使用する必要があります。私がやりたい何

Class FooSpecial 
    Inherits Foo 

    Public SpecialInfo As String 
End Class 

Class FooChildSpecial 
    Inherits FooChildBase 

    Public SpecialChildInfo As String 
End Class 

は私のFooSpecialクラスは、それは彼らがFooChildSpecialオブジェクトであるかのように子供のコレクションだが、まだそれにFooChildTwoオブジェクトを追加できるように扱う必要があります。これが可能なのかどうか、どうすればそれができますか?

編集 私の元の質問は間違っていたと思います。 FooChildBaseまたはFooChildTwoかXXXかどうかにかかわらず、Childrenコレクション内のオブジェクトのいずれかを余分な値でラップするには、FooChildSpecialクラスが必要です。

希望はこれが理にかなっています!より明確にする必要がある場合はお知らせください。

ジェームズ

答えて

1

FooSpecialChildための「ラップ」FooChildTwoするためには、それを継承するか、同じインターフェイス(IFooChildTwo)を実装する必要がありますどちらか。残念ながら、条件付きで継承したり実装したりすることはできません。そのため、FooSpecialChildクラスからFooChildTwoを継承できますが、は常にになります。FooChildTwo FooChildTwoと同じインターフェースを実装している場合と同じです。

レイアウトしたデザインパターンが正しく動作します。 FooChildSpecialとFooChildTwoの両方が同じ基本クラスから継承し、その基本クラス型のリストであるので、それはうまくいくでしょう。 .Childrenプロパティから引っ張っているときにオブジェクトのタイプをチェックするだけで済みます。

コピー+サンプルプロジェクトにコードを貼り付けた後、私は正常に行うことができます:

var foo = new Foo(); 
    foo.Children = new List<FooChildBase>(); 
    var special = new FooChildSpecial(); 
    special.SpecialChildInfo = "special"; 
    foo.Children.Add(special); 
    var two = new FooChildTwo(); 
    two.ExtraInfo = "two"; 
    foo.Children.Add(two); 

あなたは、元のリストにFooChildSpecialとFooChildTwoの両方を追加できることを示しています。

+0

返信いただきありがとうございます。しかし、私はそれを正しく説明したとは思わない。上記の私の編集を参照してください – James

+0

返信いただきありがとうございます。継承よりもむしろこれを使う方法がありますか?おそらくデコレータのようなものでしょうか? – James

+0

ラッパー(デコレータ)パターンを実装した場合、FooChildSpecialはIFooChildオブジェクトをラップできますが、最初にIFooChildオブジェクトを作成してからFooChildSpecialオブジェクトに渡す必要があります。さらに、FooChildSpecialオブジェクトをFooChildTwoに直接キャストすることはできません。代わりに、ラップされた基本オブジェクトにアクセスしてキャストする必要があります。 参照:http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_wrapper302122006080905AM/csharp_wrapper3.aspx?ArticleID=2dc1959d-83a0-4d88-ac5b-70dddc54380c – JustLoren

0

「FooChildSpecialであるかのように扱う」とはどういう意味ですか? FooChildSpecialオブジェクトにのみ存在するアクセスメソッドを意味しますか?

この場合、FooChildSpecialにキャストする必要があります。

しかし、FooSpecialにそれらをFooChildBaseオブジェクトとして扱い、FooChildSpecialとFooChildTwoには基本メソッドをオーバーライドさせて、2つのサブクラスに対して異なる動作をさせる方がよいでしょう。

FooSpecialクラスが全く必要ない気がしますが、間違っている可能性があります。私は、余分な情報と特別な情報を「情報」にまとめて、異なるタイプのクラスを初期化するために異なるタイプの情報が必要な場合にのみ使用することができます。

0

あなたは、タイプTのリストを含む基本クラスを持つジェネリックでこれを行うことができます.FooとFooSpecialを定義すると、Tが何であるかがわかります。

+0

彼は公共のIList 子供とそれを実装した場合は、FooSpecialを持っていました:Foo 、彼はFooSpecialのIListにFooChildTwo型のオブジェクトを追加できませんでした。 – JustLoren