2009-07-20 9 views
29

Próbuję zastąpić nadpisaną metodę (jeśli to ma sens!) W języku C#.Zastępowanie przesłoniętej metody (C#)

Mam scenariusz podobny do poniższego, ale kiedy mam punkt przerwania w SampleMethod() w klasie "C", nie jest on trafiony, podczas gdy uderza się w ten sam punkt przerwania w metodzie "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(); 
     } 
} 

Z góry dziękuję!


Edit:

Ok, kontekst pomogłoby:

to w kontekście kontroli kompozytowej więc klasa A dziedziczy CompositeControl i wzywa SampleMethod() po przesłanianie CreateChildControls() metoda.

+1

Jaki jest kod wywołujący? –

+0

Pokaż nam swój kod telefoniczny? –

+0

Podejdź do tej samej sytuacji, po sprawdzeniu "kodu wywołującego", problem rozwiązany. – zionpi

Odpowiedz

15

Nie widząc kodu wywołującego SampleMethod, domyślam się, że masz obiekt typu B i wywołaj metodę SampleMethod.

+0

Tak, to był po prostu głupi błąd w moim imieniu - dziękuję za waszemu (i wszystkim, którzy wnieśli swój wkład) temu czasowi. –

29

Nadpisywanie może być wykonywane w łańcuchu tak długo, jak chcesz. Pokazany kod jest poprawny.

Jedynym możliwym wyjaśnieniem zachowania, które widzisz, jest to, że obiekt, do którego się odnosisz, jest rzeczywiście typu B. Sugeruję, abyś dwukrotnie to sprawdził, a jeśli rzeczy nadal nie mają sensu, opublikuj inny odpowiedni kod.

1

To rozwiązanie działa dobrze; chociaż faktycznie używać go poza klasą metoda jest w, trzeba ustawić dostęp SampleMethod do public zamiast protected we wszystkich przypadkach, wydaje się, więc:

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

To zależy od tego, od którego jest uzyskiwany dostęp do SampleMethod. Metody Virtual/Override nie muszą być publiczne. –

3

punkt przerwania jest więcej niż prawdopodobne, nie bycie trafionym, ponieważ faktycznie utworzono instancję klasy "B".

Rozdzielczość metody nadpisywania działa w oparciu o rzeczywisty typ klasy , której metodę należy wywołać. Tak więc, jeśli miał następujący kod:

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

oraz następujące:

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

zarówno uruchomieniowe rodzajów klasy, której SampleMethod będzie nazywany jest typu B.

-1

Przesłanianie metod to funkcja OOP, która umożliwia klasie podrzędnej dostarczenie określonej implementacji metody, która jest już dostarczona przez jedną z jej klas nadrzędnych.

+1

Sądzę, że jest jasne, jaka jest nadrzędna metoda. –

0

nadrzędne więcej niż raz w hierarchii użyć czegoś jak ten

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

Zrobiłem to w tym kodzie w ten link http://www.4shared.com/rar/0SG0Rklxce/OverridingMoeThanOnce.html

Powiązane problemy