Ответ 1
Не видя код, который вызывает SampleMethod, я предполагаю, что у вас есть объект типа B и вызывается SampleMethod.
Я пытаюсь переопределить переопределенный метод (если это имеет смысл!) в С#.
У меня есть сценарий, похожий на приведенный ниже, но когда у меня есть точка останова в 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().
Не видя код, который вызывает SampleMethod, я предполагаю, что у вас есть объект типа B и вызывается SampleMethod.
Переопределение может выполняться в цепочке до тех пор, пока вам нравится. Код, который вы показали, правильный.
Единственное возможное объяснение поведения, которое вы видите, это то, что объект, к которому вы обращаетесь, действительно имеет тип B
. Я предлагаю вам дважды проверить это, и если все еще не имеет смысла, отправьте другой соответствующий код.
Точка прерывания более чем вероятно не будет удалена, потому что вы фактически создали экземпляр класса "B".
Работа над переопределением метода работает на основе фактического типа времени выполнения класса, метод которого следует вызывать. Итак, если у вас есть следующий код:
C c = new C();
c.SampleMethod();
и следующее:
C c = new C();
B b = (B)c;
b.SampleMethod();
оба типа времени выполнения класса, который будет вызываться SampleMethod
, - это тип B
.
Это решение работает нормально; хотя для фактического использования его вне класса, в котором находится этот метод, вам нужно установить доступ 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();
}
}
для переопределения более одного раза в иерархии используйте что-то вроде этого
// 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
Переопределение метода - это функция ООП, которая позволяет дочернему классу предоставлять конкретную реализацию метода, который уже предоставлен одним из его родительских классов.