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
} 
War es hilfreich?

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?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top