Ich habe eine Klasse, die von einem Tool generiert wurde und die ich daher nicht ändern kann. Die generierte Klasse ist sehr einfach (keine Schnittstelle, keine virtuellen Methoden):
class GeneratedFoo
{
public void Write(string p) { /* do something */ }
}
Im C#-Projekt wollen wir eine Möglichkeit schaffen, um eine andere Implementierung von MyFoo einzubinden. Ich denke also, dass MyFoo von GeneratedFoo abgeleitet werden soll
class MyFoo : GeneratedFoo
{
public new void Write(string p) { /* do different things */ }
}
Dann habe ich eine CreateFoo-Methode, die entweder eine Instanz der Klasse GeneratedFoo oder MyFoo zurückgeben wird. Sie ruft jedoch immer die Methode in GeneratedFoo auf.
GeneratedFoo foo = CreateFoo(); // if this returns MyFoo,
foo.Write("1"); // it stills calls GeneratedFoo.Write
Dies wird erläutert, da es sich nicht um eine virtuelle Methode handelt. Aber ich frage mich, ob es eine Möglichkeit (ein Hack vielleicht), um es die abgeleitete Methode aufrufen.
Danke,
Ian
0 Stimmen
"public new void" ? Das ist eine Verwendung von "new", die ich noch nie gesehen habe. Ist das überhaupt gültig?
0 Stimmen
New' bedeutet hier, dass Sie die Methode explizit von der Basisklasse 'abgedeckt' haben, ohne sie zu überschreiben (da sie nicht virtuell ist) - ohne dies erhalten Sie eine Warnung vom Compiler.
0 Stimmen
Um genauer zu sein - wenn Sie Ihrer Methode in der abgeleiteten Klasse den gleichen Namen wie in der Basisklasse geben, und es ist nicht überschreiben Methode, Compiler gibt Ihnen eine Warnung, dass Sie Ihre Methode versteckt geerbten Mitglied (weil Sie wahrscheinlich nicht wollte, dies zu tun), aber wenn Sie sicher sind, dass es, Sie sagen, dass der Compiler mit 'new' Schlüsselwort.
0 Stimmen
Ich bin immer begeistert, wenn Schlüsselwörter so überladen sind, dass sie je nach Kontext mehrere Bedeutungen haben. Danke, dass Sie mich aufgeklärt haben.