c# - ¿Qué pasa si no escucho la advertencia "oculta el miembro heredado. Para hacer que el miembro actual anule esa implementación... "
warnings virtual-functions (4)
Este es quizás un buen punto, pero tiene que ver con la advertencia de que el compilador emite problemas si haces algo como:
class A
{
public virtual void F() { }
}
class B : A
{
public void F() { }
}
Entonces recibes la advertencia:
''EomApp1.BF()'' hides inherited member ''EomApp1.AF()''.
To make the current member override that implementation, add the override keyword. Otherwise use the new keyword.
PREGUNTA: ¿Cuál es la advertencia que realmente me advierte que sucederá si no hago nada al respecto? ¿Mi programa funcionará de manera diferente si agrego la palabra clave ''nuevo'' en lugar de si no lo hago?
(Nota: Sé que podría probar esto fácilmente pero pensé que valía la pena preguntar aquí)
Eche un vistazo a esto ¿Existe una buena razón para ocultar a los miembros heredados? .
Esto es sólo una advertencia. El código funcionará. En alguna circunstancia, esta advertencia puede llevar a algún problema.
use una nueva palabra clave con el método que está llamando desde la clase base.
class A
{
public virtual void F() { }
}
class B : A
{
new public void F() { }
}
Referencia
https://msdn.microsoft.com/en-us/library/435f1dw2.aspx
https://msdn.microsoft.com/en-us/library/aa691135(v=vs.71).aspx
No hará nada, pero el método que tienes allí F () tampoco es polimórfico. Se vuelve muy fácil cometer errores en el código si comenzó a usar la referencia de clase base, por lo que se le advierte. Por supuesto, puede ser lo que quieras, por lo tanto, la nueva palabra clave simplemente la hace más explícita
P.ej
B b1 = new B();
b1.F(); // will call B.F()
A b2 = new B();
b2.F(); // will call A.F()
Ahora, si agrega clase C
con new
, se comportará igual que B
Si agrega clase D
con override
, entonces F
vuelve polimórfica:
class C : A
{
public new void F() { }
}
class D : A
{
public override void F() { }
}
// Later
C c1 = new C();
c1.F(); // will call C.F()
A c2 = new C();
c2.F(); // will call A.F()
D d1 = new D();
d1.F(); // will call D.F()
A d2 = new D();
d2.F(); // will call D.F()
Ver este violín .
No, el comportamiento predeterminado es exactamente el mismo que si usas new
, aparte de si se da la advertencia. En mi experiencia, en la mayoría de los casos, realmente desea especificar la override
lugar de la new
, ya que por lo general es solo un caso de olvidar la anulación explícita.
Si realmente quieres un método completamente separado, y si tienes la opción de usar un nombre diferente, tomaría ese enfoque. Tener un método que oculte a otro generalmente reduce la legibilidad significativamente de la OMI. No es tan malo si el propósito es simplemente dar un tipo de retorno más específico (y se asegura de que el método más débilmente tipificado devuelva el mismo valor), pero ese es un caso bastante raro.