C# Aufruf überschrieben Unterklasse Methoden, ohne zu wissen, dass es eine Unterklasse-Instanz
Ich habe eine base-Klasse mit einer virtuellen Methode, und mehrere Unterklassen überschreiben diese Methode.
Wenn ich auf eines dieser Unterklassen, ich würde gerne die überschriebene Methode, aber ohne Kenntnis der Unterklasse. Ich kann mir denken, hässlich Möglichkeiten, dies zu tun (prüfen auf Wert und werfe es), aber es scheint, wie es sein sollte, eine Sprache Weg, es zu tun. Ich möchte der Liste enthalten mehrere Unterklassen innerhalb der gleichen Liste, sonst natürlich könnte ich auch einfach eine Liste machen.
EDIT: Behoben, wird der Kommentar in den code, der falsch war, was dazu führte, das sehr geeignete erste Antwort bekam ich 🙂
Zum Beispiel:
Class Foo
{
public virtual printMe()
{
Console.Writeline("FOO");
}
}
Class Bar : Foo
{
public override printMe()
{
Console.Writeline("BAR");
}
}
List<Foo> list = new List<Foo>();
//then populate this list with various 'Bar' and other overriden Foos
foreach (Foo foo in list)
{
foo.printMe(); //prints FOO.. Would like it to print BAR
}
InformationsquelleAutor John Noonan | 2008-12-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
InformationsquelleAutor Daniel Earwicker
Warum sollte es print "Foo"? Das ist nicht der Zweck der virtuellen Methoden. Der springende Punkt ist, dass die abgeleiteten Klassen können die Weise ändern, die Funktion arbeitet ohne änderung der Schnittstelle. Ein Foo-Objekt wird print "Foo" und ein Bar-Objekt wird gedruckt "Bar". Alles andere wäre falsch.
InformationsquelleAutor Ed S.
Nutzen Sie die neue modifier explizit ausblenden ein Mitglied von einer Basisklasse geerbt wurden. Ausblenden eines geerbten Mitglieds, deklarieren Sie Sie in der abgeleiteten Klasse mit dem gleichen Namen, und ändern Sie es mit dem neuen Modifikator. Dies wird im Ergebnis genau das Verhalten, das Sie möchten.
Für mehr info gehen Sie hier: http://geekswithblogs.net/Mohamed/articles/28613.aspx
InformationsquelleAutor Manu
Um das Verhalten, das Sie in dieser situation wollen, Sie könnten entfernen Sie die virtual in der Basisklasse und nutzen Sie die neue auf die Unterklasse.
Jedoch, wie Ed Swangren angegeben, warum würden Sie?
InformationsquelleAutor toad
Gibt es nicht eine Lösung, wo Sie nur gegossen Sie das gewünschte Objekt, rufen die anderen:
wird
Oder bin ich fehlt ein Teil der Frage?
Ah,sorry, ich habe einen Satz von Klammern, die zweite Linie sein sollte ((Foo), foo).printMe(); das sollte return foo, wie es CASTET das Objekt und macht dann den call.
InformationsquelleAutor JB King