2009-07-20 14 views
29

Sto provando a sovrascrivere un metodo sottoposto a override (se questo ha senso!) In C#.Sovrascrivi un metodo sottoposto a override (C#)

Ho uno scenario simile al seguente, ma quando ho un breakpoint in SampleMethod() nella classe "C" non viene colpito, mentre viene colpito lo stesso punto di interruzione nel metodo "B".

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(); 
     } 
} 

Grazie in anticipo!


Edit:

Ok, il contesto avrebbe aiutato:

Questo è nel contesto di un controllo composito in modo da classe A eredita da CompositeControl e chiama SampleMethod() dopo ignorando le CreateChildControls() metodo.

+1

Qual è il codice chiamante? –

+0

Mostraci il tuo codice di chiamata? –

+0

Vieni nella stessa situazione, dopo aver controllato il 'codice chiamante', problema risolto. – zionpi

risposta

15

Senza vedere il codice che chiama SampleMethod, la mia ipotesi sarebbe che si ha un oggetto di tipo B e si chiama SampleMethod su quello.

+0

Sì, questo è stato solo uno stupido errore per me - grazie per il tuo (e per tutti quelli che hanno contribuito) il tempo speso per questo. –

29

L'override può essere eseguita in una catena finché lo si desidera. Il codice che hai mostrato è corretto.

L'unica spiegazione possibile per il comportamento visualizzato è che l'oggetto a cui si fa riferimento è in realtà di tipo B. Ti suggerisco di ricontrollare questo e, se le cose non hanno ancora senso, postare l'altro codice appropriato.

1

Questa soluzione funziona correttamente; anche se utilizzare effettivamente al di fuori della classe il metodo è in, è necessario impostare l'accesso dei SampleMethod-public piuttosto che protected in tutti i casi sembra, quindi:

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

Dipende da dove si accede a SampleMethod. I metodi Virtual/Override non devono essere pubblici. –

3

Il punto di interruzione è più che probabile che non essere colpito perché hai effettivamente istanziato un'istanza della classe "B".

La risoluzione del metodo di override funziona in base al tempo di esecuzione effettivo della classe il cui metodo deve essere chiamato. Quindi, se si ha il seguente codice:

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

e la seguente:

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

entrambe le runtime tipi di classe i cui SampleMethod sarà chiamata è di tipo B.

-1

L'override del metodo è una funzione OOP che consente a una classe figlia di fornire un'implementazione specifica di un metodo già fornito da una delle sue classi padre.

+1

Suppongo sia chiaro quale metodo sia prioritario. –

0

per escludere più di una volta in uso gerarchia di qualcosa di simile

// 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(); 
    } 
} 

ho fatto in questo codice in questo link http://www.4shared.com/rar/0SG0Rklxce/OverridingMoeThanOnce.html

Problemi correlati