7 Stimmen

Wie man den Aufruf einer abgeleiteten C#-Methode erzwingt

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.

0voto

Ian Ringrose Punkte 50437

Wie wäre es mit einer benutzerdefinierten FX-Cop-Regel, die zu Ihrem Build-System hinzugefügt wird?

-1voto

Chris Shaffer Punkte 31499

Ein Ansatz, den Sie verwenden könnten, wäre, einige neue Klassen zu definieren, die alle von GeneratedFoo abgeleitet sind; z.B.:

public class MyFooBase : GeneratedFoo
{
    public virtual void MyMethod() { ... }
}

public class MyFoo1 : MyFooBase { ... }

public class MyFoo2 : MyFooBase { ... }

Dies würde es Ihnen ermöglichen, Ihrer generierten Klasse virtuelle Methoden hinzuzufügen.

0 Stimmen

Aber keine nicht-virtuelle Methode aus dem erzeugten foo aufrufen, da sie virtuell wäre.

0 Stimmen

Aber Sie könnten eine neue Methode schreiben, die virtuell war und die nicht-virtuelle in der abgeleiteten Klasse aufrief, die dieses Verhalten haben sollte, und die nicht-virtuelle in der abgeleiteten Klasse, die dieses Verhalten nicht haben sollte, nicht aufrief.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X