2009-07-30 21 views
0

Ich habe eine Klasse namens Foo. Diese Klasse enthält eine Sammlung von Child-Objekten vom Typ FooChildBase, aber ich habe auch eine weitere Klasse vom Typ FooChildTwo, die von FooChildBase erbt.Erweitern eines Objekts und aller untergeordneten Sammlungen?

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 

Das alles funktioniert gut. Jetzt muss ich eine Spezialisierung meines Foo-Objekts mit zusätzlichen Informationen verwenden.

Class FooSpecial 
    Inherits Foo 

    Public SpecialInfo As String 
End Class 

Class FooChildSpecial 
    Inherits FooChildBase 

    Public SpecialChildInfo As String 
End Class 

Was würde ich tun möchte, ist habe meine FooSpecial Klasse behandeln es ist Kinder Sammlung, als ob sie FooChildSpecial Objekte waren, aber noch in der Lage sein FooChildTwo Objekte, um es hinzuzufügen. Ist das möglich und wenn ja, wie kann es gemacht werden?

BEARBEITEN Ich denke, meine ursprüngliche Frage war falsch. Ich muss FooChildSpecial-Klasse, um alle Objekte in der Children-Auflistung mit den zusätzlichen Werten zu umbrechen, ob es FooChildBase oder FooChildTwo oder XXX sind.

Hoffe das macht Sinn! Bitte lassen Sie mich wissen, wenn mehr Klärung erforderlich ist.

James

Antwort

1

Damit FooSpecialChild zu "Wrap" FooChildTwo, entweder es hat von ihm erben oder die gleiche Schnittstelle (IFooChildTwo) implementieren. Leider kann man nicht erben oder implementieren ... es ist entweder immer oder nie. So kann Ihre FooSpecialChild Klasse von FooChildTwo erben, aber dann wird immer ein FooChildTwo sein. Gleiches, wenn es dieselbe Schnittstelle wie FooChildTwo implementiert.

Das Designmuster, das Sie angelegt haben, funktioniert ordnungsgemäß. Da sowohl FooChildSpecial als auch FooChildTwo von derselben Basisklasse erben und die Liste diesen Basisklassentyp hat, wird es funktionieren. Sie müssen nur den Typ des Objekts überprüfen, wenn Sie von der Eigenschaft .Children ziehen.

Nach Kopie + Code in einem Beispielprojekt einfügen, konnte ich erfolgreich tun:

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); 

, die zeigt, dass Sie beide FooChildSpecial und FooChildTwo zu Ihrer ursprünglichen Liste hinzufügen können.

+0

Danke für die Antwort.Ich glaube jedoch nicht, dass ich es richtig erklärt habe. Siehe meine Bearbeitung über – James

+0

Danke nochmal für die Antwort. Gibt es einen Weg um dies zu erreichen, indem man eher die Zusammensetzung als die Vererbung verwendet. Vielleicht etwas wie ein Dekorateur? – James

+0

Wenn Sie ein Wrapper (Decorator) -Muster implementiert haben, kann FooChildSpecial ein IFooChild-Objekt umbrechen. Dazu müssen Sie jedoch zuerst das IFooChild-Objekt erstellen und es dann an das FooChildSpecial-Objekt übergeben. Darüber hinaus wäre es nicht möglich, das FooChildSpecial-Objekt direkt auf ein FooChildTwo zu übertragen. Stattdessen müssten Sie auf das zugrunde liegende Wrapped-Objekt zugreifen und dieses umwandeln. Siehe auch: http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_wrapper302122006080905AM/csharp_wrapper3.aspx?ArticleID=2dc1959d-83a0-4d88-ac5b-70dddc54380c – JustLoren

0

Was meinen Sie mit "behandeln, als wären sie FooChildSpecial" Objekte? Meinst du Zugriffsmethoden, die nur in FooChildSpecial-Objekten existieren?

In diesem Fall müssen Sie sie auf FooChildSpecial umwandeln.

Es ist jedoch besser, FooSpecial nur als FooChildBase-Objekte behandeln zu lassen, aber in FooChildSpecial und FooChildTwo die Basismethoden zu überschreiben, um unterschiedliche Verhaltensweisen für die beiden Unterklassen zu erhalten.

Ich habe auch das Gefühl, dass Sie die FooSpecial-Klasse wirklich nicht brauchen, aber ich könnte falsch liegen. Ich vermute, dass die zusätzlichen Informationen und speziellen Informationen einfach zu "Informationen" kombiniert werden könnten und wenn sie verschiedene Arten von Informationen benötigen, um die Klasse mit den verschiedenen Typen zu initialisieren.

0

Sie könnten es mit Generika machen, dass Sie eine Basisklasse haben, die eine Liste von Typ T enthält. Wenn Sie Foo und FooSpecial definieren, geben Sie an, was T ist.

+0

Wenn er es mit öffentlichen IList Kinder umgesetzt, hatte dann FooSpecial : Foo , er konnte keine Objekte vom Typ FooChildTwo zur IList in FooSpecial hinzufügen. – JustLoren

Verwandte Themen