Переопределить переопределенный метод (C #) - PullRequest
36 голосов
/ 20 июля 2009

Я пытаюсь переопределить переопределенный метод (если это имеет смысл!) В C #.

У меня есть сценарий, похожий на приведенный ниже, но когда у меня есть точка останова в SampleMethod () в классе "C", она не срабатывает, в то время как та же точка останова в методе "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(); 
      }
}

Заранее спасибо!


Редактировать:

Хорошо, контекст поможет:

Это в контексте составного элемента управления, поэтому класс A наследуется от CompositeControl и вызывает SampleMethod () после переопределения метода CreateChildControls ().

Ответы [ 6 ]

37 голосов
/ 20 июля 2009

Переопределение может выполняться в цепочке сколько угодно.Код, который вы показали, верен.

Единственное возможное объяснение поведения, которое вы видите, это то, что объект, на который вы ссылаетесь, на самом деле имеет тип B.Я предлагаю вам проверить это дважды, и если что-то все еще не имеет смысла, опубликуйте другой соответствующий код.

17 голосов
/ 20 июля 2009

Не видя код, который вызывает SampleMethod, я предполагаю, что у вас есть объект типа B и вызовите SampleMethod для этого.

3 голосов
/ 20 июля 2009

Точка останова, скорее всего, не будет достигнута, потому что вы фактически создали экземпляр класса "B".

Разрешение переопределения метода работает на основе фактического времени выполнения типа класса, метод которого должен быть вызван. Итак, если у вас был следующий код:

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

и следующее:

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

оба типа runtime класса, для которого будет вызываться SampleMethod, имеют тип B.

2 голосов
/ 20 июля 2009

Это решение отлично работает; хотя для фактического использования его вне класса, в котором находится метод, вам нужно установить доступ SampleMethod к public вместо protected во всех случаях, когда он появляется, поэтому:

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();
    }
}
1 голос
/ 14 мая 2015

для переопределения более одного раза в иерархии используйте что-то вроде этого

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

Я сделал это в этом коде по этой ссылке http://www.4shared.com/rar/0SG0Rklxce/OverridingMoeThanOnce.html

0 голосов
/ 24 июля 2011

Переопределение метода - это функция ООП, которая позволяет дочернему классу предоставлять конкретную реализацию метода, которая уже предоставлена ​​одним из его родительских классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...