C #, ohne Wissen überschriebenen Unterklasse Methoden aufrufen, dass es eine Unterklasse Instanz
-
23-08-2019 - |
Frage
Ich habe eine Basisklasse mit einer virtuellen Methode und mehr Unterklassen, die diese Methode außer Kraft setzen.
Wenn ich eine dieser Unterklassen begegnen, ich möchte die überschriebene Methode nennen, aber ohne Kenntnis der Unterklasse. Ich kann hässlich Möglichkeiten denken, dies zu tun (Wert überprüfen und werfen es), aber es scheint, wie es sollte eine in-Sprache Art und Weise, es zu tun. Ich mag die Liste auf mehrere Unterklassen innerhalb derselben Liste enthalten, sonst offensichtlich konnte ich nur eine Liste machen.
EDIT: Kommentar im Code behoben, der falsch war, die auf die sehr angemessen erste Antwort führt Ich habe :)
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
}
Lösung
class Foo
{
public virtual void virtualPrintMe()
{
nonVirtualPrintMe();
}
public void nonVirtualPrintMe()
{
Console.Writeline("FOO");
}
}
class Bar : Foo
{
public override void virtualPrintMe()
{
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.virtualPrintMe(); // prints BAR or FOO
foo.nonVirtualPrintMe(); // always prints FOO
}
Andere Tipps
Warum sollte es drucken "Foo"? Das ist nicht der Zweck der virtuellen Methoden. Der springende Punkt ist, dass die abgeleiteten Klassen den Weg ohne Änderung der Schnittstelle die Funktion arbeitet ändern können. Ein Foo Objekt druckt „Foo“ und ein Bar-Objekt druckt „Bar“. Alles andere wäre falsch.
Mit den neuen Modifikator explizit ein Mitglied aus einer Basisklasse geerbt verstecken. Um ein geerbte Mitglied zu verstecken, erklären sie in der abgeleiteten Klasse mit dem gleichen Namen, und ändern Sie es mit dem neuen Modifikator. Dies wird das Verhalten in genau führen Sie wollen.
Für weitere Informationen gehen Sie hier: http://geekswithblogs.net/Mohamed/articles/28613 aspx
Um das Verhalten erhalten Sie in dieser Situation wollen Sie das virtuelle auf der Basisklasse entfernen konnte und auf der Unterklasse neu verwenden.
Doch wie Ed Swangren angegeben, warum würden Sie?
Gibt es nicht eine Lösung, wo man nur das Objekt werfen wollen Sie das andere nennen:
foo.printMe(); // prints FOO.. Would like it to print BAR
wird
(Foo)foo.printMe(); // foo can be any derived class of Foo.
Oder bin ich einen Teil der Frage fehlt?