Подтвердить что ты не робот

Переопределить переопределенный метод (С#)

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

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

Спасибо заранее!


Изменить:

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

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

и следующее:

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

оба типа времени выполнения класса, который будет вызываться SampleMethod, - это тип B.

Ответ 4

Это решение работает нормально; хотя для фактического использования его вне класса, в котором находится этот метод, вам нужно установить доступ 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();
    }
}

Ответ 5

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

// 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

Ответ 6

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