2009-07-20 38 views
29

Ich versuche, eine überschriebene Methode (wenn das Sinn macht!) In C# zu überschreiben.Außer Kraft setzen einer überschriebenen Methode (C#)

Ich habe ein Szenario ähnlich dem unten, aber wenn ich einen Haltepunkt in der SampleMethod() in der "C" -Klasse habe, wird es nicht getroffen, während der gleiche Haltepunkt in der "B" -Methode getroffen wird.

public class A 
{ 
     protected virtual void SampleMethod() {} 
} 

public class B : A 
{ 
     protected override void SampleMethod() 
     { 
      base.SampleMethod(); 
     } 
} 

public class C : B 
{ 
     protected override void SampleMethod() 
     { 
      base.SampleMethod(); 
     } 
} 

Vielen Dank im Voraus!


Edit:

Ok, würde der Kontext helfen:

Dies im Rahmen einer Verbundsteuerung ist so Klasse A von Composite erbt und ruft SampleMethod() nach der Create zwingende() Methode.

+1

Was ist der aufrufende Code? –

+0

Zeigen Sie uns Ihre Telefonvorwahl? –

+0

Kommen Sie in die gleiche Situation, nach Überprüfung der 'Calling Code', Problem gelöst. – zionpi

Antwort

15

Ohne den Code zu sehen, der SampleMethod aufruft, würde ich annehmen, dass Sie ein Objekt vom Typ B haben und SampleMethod aufrufen.

+0

Ja, das war nur ein dummer Fehler in meinem Namen - danke für deine (und alle anderen, die dazu beigetragen haben), die Zeit dafür. –

29

Das Überschreiben kann in einer Kette so lange ausgeführt werden, wie Sie möchten. Der Code, den Sie angezeigt haben, ist korrekt.

Die einzige mögliche Erklärung für das Verhalten, das Sie sehen, ist, dass das Objekt, auf das Sie verweisen, tatsächlich vom Typ B ist. Ich schlage vor, dass Sie dies überprüfen, und wenn die Dinge immer noch keinen Sinn machen, posten Sie den anderen geeigneten Code.

1

Diese Lösung funktioniert gut; obwohl es tatsächlich außerhalb der Klasse verwendet die Methode in ist, müssen Sie es scheint, den Zugang von SampleMethod-public statt protected in allen Fällen setzen, so:

public class A 
{ 
    public virtual void SampleMethod() 
    { 
     Console.WriteLine("lol"); 
    } 
} 

public class B : A 
{ 
    public override void SampleMethod() 
    { 
     base.SampleMethod(); 
    } 
} 

public class C : B 
{ 
    public override void SampleMethod() 
    { 
     base.SampleMethod(); 
    } 
} 
+0

Es hängt davon ab, wo auf SampleMethod zugegriffen wird. Virtuelle/Override-Methoden müssen nicht öffentlich sein. –

3

Der Haltepunkt mehr als wahrscheinlich nicht getroffen werden, weil Sie tatsächlich eine Instanz der Klasse "B" instanziiert haben.

Methode Override-Auflösung funktioniert basierend auf der tatsächlichen Laufzeit Typ der Klasse, deren Methode aufgerufen werden sollte. Also, wenn Sie hatte den folgenden Code:

C c = new C(); 
c.SampleMethod(); 

und die folgende:

C c = new C(); 
B b = (B)c; 
b.SampleMethod(); 

sowohl die Laufzeit Typen der Klasse, deren SampleMethod aufgerufen werden soll, geben Sie B.

-1

Überschreibende Methode ist die OOP-Funktion, die einer untergeordneten Klasse ermöglicht, eine bestimmte Implementierung einer Methode bereitzustellen, die bereits von einer ihrer übergeordneten Klassen bereitgestellt wird.

+1

Ich denke, es ist klar, welche Methode Vorrang hat. –

0

für mehr als einmal in der Hierarchie Verwendung so etwas wie diese

// abstract class 
abstract class A 
    { 
     public abstract void MethodOne(); 
    } 

// class B inherits A 
class B : A 
{ 
    public override void MethodOne() 
    { 
     Console.WriteLine("From Class B"); 
    } 
} 

// class C inherits B 
class C : B 
{ 
    public override void MethodOne() 
    { 
     Console.WriteLine("From Class C"); 
    } 
} 

// class D inherits C 
class D : C 
{ 
    public override void MethodOne() 
    { 
     Console.WriteLine("From Class D"); 
    } 
} 

// etc...... 

// class Main method Class 

class MainClass 
{ 
    public static void Main() 
    { 
     B[] TestArray = new B[3]; 
     B b1 = new B(); 
     C c1 = new C(); 
     D d1 = new D(); 

     TestArray[0] = b1; 
     TestArray[1] = c1; 
     TestArray[2] = d1; 

     for (int i = 0; i < TestArray.Length; i++) 
     { 
      TestArray[i].MethodOne(); 
     } 

     Console.ReadLine(); 
    } 
} 

Aufschalten ich es in diesem Link in diesem Code habe http://www.4shared.com/rar/0SG0Rklxce/OverridingMoeThanOnce.html

Verwandte Themen