cref - Anular un método reemplazado(C#)
remarks c# (6)
Estoy tratando de anular un método reemplazado (¡si eso tiene sentido!) En C #.
Tengo un escenario similar al siguiente, pero cuando tengo un punto de interrupción en SampleMethod () en la clase "C", no se golpea, mientras se golpea el mismo punto de interrupción en el método "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();
}
}
¡Gracias por adelantado!
Editar:
Ok, el contexto ayudaría:
Esto es en el contexto de un control compuesto, por lo que la clase A hereda de CompositeControl y llama a SampleMethod () después de anular el método CreateChildControls ().
Es muy probable que el punto de interrupción no sea afectado porque usted creó una instancia de la clase "B".
La resolución de anulación de método funciona en función del tipo de tiempo de ejecución real de la clase cuyo método debe invocarse. Entonces, si tuvieras el siguiente código:
C c = new C();
c.SampleMethod();
y lo siguiente:
C c = new C();
B b = (B)c;
b.SampleMethod();
ambos tipos de ejecución de la clase a la que se SampleMethod
son de tipo B
Esa solución funciona bien; aunque para usarlo fuera de la clase en la que se encuentra el método, debe establecer el acceso de SampleMethod
en public
lugar de protected
en todos los casos en que aparece, por lo que:
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();
}
}
La anulación se puede realizar en una cadena todo el tiempo que desee. El código que has mostrado es correcto.
La única explicación posible para el comportamiento que estás viendo es que el objeto al que te refieres es en realidad del tipo B
Sugiero que verifique esto dos veces, y si las cosas aún no tienen sentido, publique el otro código apropiado.
La sobrescritura de métodos es la característica OOP que permite que una clase secundaria proporcione una implementación específica de un método que ya está provisto por una de sus clases principales.
Sin ver el código que llama a SampleMethod, supongo que tiene un objeto de tipo B y lo llama a SampleMethod.
para Anular más de una vez en la jerarquía, use algo como esto
// 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();
}
}
Lo hice en este código en este enlace http://www.4shared.com/rar/0SG0Rklxce/OverridingMoeThanOnce.html