Cast übergeordnete Klasse untergeordnete Klasse
Ich habe Nachricht-Klasse, die ich verlängert und Addierte neue Eigenschaft.
class ChildMessage: Message
{
prop...
}
Beim Versuch Sie zu Nachricht hinzufügen-Klasse, um ChildMessage Liste, die ich bekommen Null-Verweis für zusätzliche Klasse.
var myChildList =new List<ChildMessage> ();
var myParentClass = new Message();
myChildList.add(myParentClass as ChildMessage)
myChildList[0] == null //Always return null
Was ist falsch an meinem code? Was sind die alternativen?
InformationsquelleAutor Tomas | 2012-03-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es denn eine wahre Instanz von
Message
ist nicht einChildMessage
, in der Erwägung, dass eine Instanz vonChildMessage
ist einMessage
.Sofern
myParentClass
ist eigentlich instanziiert mitChildMessage
Sie nicht verwenden, den cast-operator eine Kraft nach vorne geworfen, als der tatsächliche zugrunde liegende Typ istMessage
.Dieser sagte, gibt es
implicit
undexplicit
cast-Operatoren zur Verfügung, die für den Einsatz auf Typen, so könnte man vielleicht einen erstellen, das dauert einMessage
- und Ausgänge einChildMessage
.http://msdn.microsoft.com/en-us/library/85w54y0a.aspx
Wissen, dass Sie gegeben sind, diese Typen und Sie haben keine Wahl aber, Sie zu benutzen, haben Sie zwei Möglichkeiten, um zu erweitern, geben.
Erste Option
Verwendung des decorator/wrapper-Muster zu wickeln
Message
innerhalb einerChildMessage
:Dann setzen Sie entweder die
Message
oder seine Eigenschaften durch dieChildMessage
Klasse.Zweite Option
Dies ist genauso möglich, Erben von der
Message
, aber wenn Sie wollen eineChildMessage
aus einerMessage
müssen Sie konvertieren, nicht Besetzung:Neue Eltern-Klassen? Das ist nicht, wie Vererbung funktioniert.
Ich sage nicht, dass "Vererbung funktioniert, indem Sie übergeordneten Klassen", ich bin nämlich ein typisches Beispiel für die Vererbung ist dabei eine Menge von abgeleiteten Typen und über die gemeinsame Basis geben, Sie zu erreichen, einige gemeinsame Verhaltensweisen.
Sie sagen zu instanziieren Kind-Klasse anstelle der Eltern. Aber ich habe die parent-Klasse, die ich von einem Objekt. Ich habe es und ich brauche es zu benutzen! Die demo, die ich gepostet hast, ist nur für Beispiel. Ich habe die Parent-Klasse mit Eigenschaften im inneren. Ich muss die Klasse erweitern mit einigen neuen Eigenschaften, dieses weiter zu benutzen. Danke für die Beispiele und Beschreibungen, aber ich weiß wirklich nicht, wie zu tun. Wie zu verwenden implizite und explizite?
Ah, ich sehe - ja, die arbeiten können, während Sie noch entwerfen von Klassen und die Hierarchie nicht in Stein gemeißelt, noch durch anderen code abhängig. Ich bin nicht allzu gern der Erbe selbst.
InformationsquelleAutor Adam Houldsworth
Ich denke, dass Sie irgendwie auf die falsche Weise - in der Regel möchten Sie vielleicht so etwas wie:
InformationsquelleAutor Carsten
Wenn Sie änderungen in Ihrem code auf diese Weise
Jetzt haben Sie eine Liste, wo die Objekte sind vom Typ ChildMessage oder
andere Typen abgeleitet von der Nachricht.
Sie könnten überprüfen Sie die richtige Art später, wenn Sie die gespeicherten Objekte in der Liste.
Ich bin verwirrt jetzt. Wenn die Klasse B leitet sich aus der Klasse A und C auch von Einer, die Sie speichern könnte alle Instanzen von A,B,C in eine Liste<A>. Natürlich benötigen Sie einen Mechanismus, um zu wissen, die genaue Art des Objekts, die beim abrufen von Elementen aus der Liste<A>. Dies könne in vielfältiger Weise in C# (suchen Sie nach Schlüsselwörtern 'als', 'wird' und 'typeof')
Ich habe Klasse A und ich bekomme diese von einem anderen Objekt als neue Instanz. Ich brauche zu speichern, um die Liste<B>. Wo B:A. How to cast A nach B?
Eine Instanz von A ist eine Instanz von B eine Instanz von B ist auch eine Instanz von A. mehr detaillierte @Adam Houldsworth Antwort-
InformationsquelleAutor Steve
Einen Zauber auf ein Objekt kann nicht verwendet werden, um ändern seiner Art: es ist nicht Konvertierung.
Es dient nur dazu sagen den Typ eines Objekts: Sie erklären, dass Sie möchten, um das Objekt als ein Objekt dieser Art, und das Objekt muss bereits sein, geben Sie, oder erhalten Sie einen Fehler (zumindest in einer anständigen Sprache wie C#).
Casting Objekte ist sinnvoll, weil Dank der Vererbung, Objekte können von mehreren Typen auf einmal.
In Ihrem code, jeder
ChildMessage
ist einMessage
, aber dieMessage
s, die Sie erstellen, werden nichtChildMessage
s, so versuchen, Sie zu benutzen, wie eine solche ausfällt.Dagegen, "wirft" von, sagen wir, integers, reals, oder Umgekehrt, kann tatsächlich Konvertierungen. (Terminologie in ES ist ein hoffnungsloser Dschungel.)
InformationsquelleAutor reinierpost