Nein, Sie können eine nicht virtuelle Methode nicht überschreiben. Das Beste, was Sie tun können, ist, die Methode auszublenden, indem Sie eine new
Methode mit demselben Namen erstellen. Dies ist jedoch nicht ratsam, da dies gegen gute Entwurfsprinzipien verstößt.
Aber selbst wenn Sie eine Methode ausblenden, erhalten Sie keine polymorphe Ausführung von Methodenaufrufen, wie dies bei einem echten virtuellen Methodenaufruf der Fall wäre. Betrachten Sie dieses Beispiel:
using System;
class Example
{
static void Main()
{
Foo f = new Foo();
f.M();
Foo b = new Bar();
b.M();
}
}
class Foo
{
public void M()
{
Console.WriteLine("Foo.M");
}
}
class Bar : Foo
{
public new void M()
{
Console.WriteLine("Bar.M");
}
}
In diesem Beispiel rufen beide die M
Methode print auf Foo.M
. Wie Sie sehen können, können Sie mit diesem Ansatz eine neue Implementierung für eine Methode erstellen, solange der Verweis auf dieses Objekt vom richtigen abgeleiteten Typ ist. Das Ausblenden einer Basismethode unterbricht jedoch den Polymorphismus.
Ich würde empfehlen, dass Sie Basismethoden nicht auf diese Weise ausblenden.
Ich neige dazu, mich auf die Seite derjenigen zu stellen, die das Standardverhalten von C # bevorzugen, dass Methoden standardmäßig nicht virtuell sind (im Gegensatz zu Java). Ich würde noch weiter gehen und sagen, dass Klassen standardmäßig auch versiegelt werden sollten. Vererbung ist schwer richtig zu entwerfen und die Tatsache, dass es eine Methode gibt, die nicht als virtuell markiert ist, zeigt an, dass der Autor dieser Methode niemals beabsichtigt hat, die Methode zu überschreiben.
Edit: "Ausführungszeit polymorpher Versand" :
Damit meine ich das Standardverhalten, das zur Ausführungszeit auftritt, wenn Sie virtuelle Methoden aufrufen. Nehmen wir zum Beispiel an, dass ich in meinem vorherigen Codebeispiel anstelle einer nicht virtuellen Methode tatsächlich eine virtuelle Methode und eine echte überschriebene Methode definiert habe.
Wenn ich b.Foo
in diesem Fall anrufen würde, würde die CLR den Objekttyp, auf den die b
Referenz verweist, korrekt bestimmen Bar
und den Anruf M
entsprechend weiterleiten.