2012-04-02 16 views
7

Ich habe den folgenden einfachen CodeSo rufen Sie eine überschriebene Methode mit Überladungen auf?

abstract class A 
{ 
    public abstract void Test(Int32 value); 
} 

class B : A 
{ 
    public override void Test(Int32 value) 
    { 
     Console.WriteLine("Int32"); 
    } 

    public void Test(Double value) 
    { 
     Test((Int32)1); 
    } 
} 

Wenn ich diesen Code die Zeile-Test lief ((Int32) 1) Stapelüberlauf verursacht aufgrund unendliche Rekursion. Der einzig mögliche Weg, um richtig richtige Methode aufrufen (mit Integer-Parameter) I gefunden

(this as A).Test(1); 

Aber das ist für mich nicht geeignet, da beide Methoden Test-öffentlich sind, und ich bin die Nutzer bereit beide in der Lage sein zu nennen Methode?

Antwort

4

Leider, um die A::Test(int) über eine B Referenz zu nennen, wird eine Art Besetzung benötigt. Solange der C# -Compiler die Referenz durch B sieht, wählt er die B::Test(double) Version aus.

Eine etwas weniger hässliche Version ist der folgende

((A)this).Test(1); 

Ein anderer Gedanke ist jedoch eine private Methode mit einem anderen Namen hat, die beide in füttern.

class B : A { 
    public override void Test(int i) { 
    TestCore(i); 
    } 
    public void Test(double d) { 
    TestCore(1); 
    } 
    private void TestCore(int i) { 
    // Combined logic here 
    } 
} 
5

-Methodenüberladung Auflösung in C# verhält sich nicht immer wie man erwarten könnte, aber Ihr Code verhält sich entsprechend der Spezifikation (I schrieb a blog post darüber eine Weile her).

Kurz gesagt, starten Sie den Compiler von der Suche nach Methoden aus, die

  • den gleichen Namen (in Ihrem Fall Test)
  • sind in der Art erklärt (in Ihrem Fall B) oder einer seiner Basis Typen
  • nicht mit der Überschreibung Modifikator
erklärt

zu beachten, dass letzten Punkt. Dies ist tatsächlich logisch, da virtuelle Methoden zur Laufzeit, nicht zur Kompilierzeit aufgelöst werden.

Wenn der Typ (in diesem Fall B) eine Methode hat, die ein Kandidat ist (was bedeutet, dass die Parameter in Ihrem Aufruf implizit in den Parametertyp der Kandidatenmethode konvertiert werden können), wird diese Methode verwendet . Ihre überschriebene Methode ist nicht einmal Teil des Entscheidungsprozesses.

Wenn Sie Ihre überschriebene Methode aufrufen möchten, müssen Sie das Objekt zuerst auf seinen Basistyp umwandeln.

Verwandte Themen