c# - sobreescritura - sobrecarga de metodos visual basic
¿Cómo explicar este comportamiento con métodos sobrecargados y anulados? (3)
Eric Lippert solía decir siempre "más cerca es mejor" .
Un primer método declarado en una clase derivada está más cerca que un primer método declarado en una clase base.
Entonces, a partir del enlace anterior, la clase derivada está más cerca, por lo tanto, se elige.
Este comportamiento se implementa cuidadosamente para evitar un problema de clase base frágil.
Para completar voy a compartir las balas:
Un primer método declarado en una clase derivada está más cerca que un primer método declarado en una clase base.
Un método en una clase anidada está más cerca que un método en una clase contenedora.
Cualquier método del tipo de recepción es más cercano que cualquier método de extensión.
Un método de extensión encontrado en una clase en un espacio de nombres anidado es más cercano que un método de extensión encontrado en una clase en un espacio de nombres externo.
Un método de extensión encontrado en una clase en el espacio de nombres actual está más cerca que un método de extensión encontrado en una clase en un espacio de nombres mencionado por una directiva using.
Un método de extensión encontrado en una clase en un espacio de nombres mencionado en una directiva de uso donde la directiva está en un espacio de nombres anidado es más cercano que un método de extensión encontrado en una clase en un espacio de nombres mencionado en una directiva de uso donde la directiva está en un espacio de nombres externo.
Esta pregunta ya tiene una respuesta aquí:
- Resolución de sobrecarga y métodos virtuales 5 respuestas.
¿Alguien podría ser tan amable y explicarme por qué este código muestra Derived.DoWork(double)
? Puedo dar algunas explicaciones para este comportamiento, sin embargo, quiero que alguien me aclare esto.
using System;
public class Base
{
public virtual void DoWork(int param) {
Console.WriteLine("Base.DoWork");
}
}
public class Derived : Base
{
public override void DoWork(int param) {
Console.WriteLine("Derived.DoWork(int)");
}
public void DoWork(double param) {
Console.WriteLine("Derived.DoWork(double)");
}
public static void Main() {
int val = 5;
Derived d = new Derived();
d.DoWork(val);
}
}
Este comportamiento es aparentemente por diseño:
"Al elegir una sobrecarga, si hay métodos compatibles declarados en una clase derivada, todas las firmas declaradas en la clase base se ignoran, ¡incluso si se anulan en la misma clase derivada!" http://social.msdn.microsoft.com/Forums/vstudio/en-US/a70b25d4-f310-4d06-9dc2-a453f822f4f3/function-not-getting-called-when-overloading-the-function-of-base-class-in-derived-class-with?forum=csharpgeneral
Este comportamiento se define en la Especificación de lenguaje C #, específicamente la sección 7.5.3 "Resolución de sobrecarga". Aquí hay un enlace a una versión anterior ; de lo contrario, consulte la Especificación de lenguaje CSharp.docx que debe tener localmente, por ejemplo, C: / Archivos de programa (x86) / Microsoft Visual Studio 12.0 / VC # / Especificaciones / 1033 / CSharp Especificación de idioma. docx
En este caso, los métodos marcados como anulación se excluyen, por lo tanto, la sobrecarga double
es la única opción válida (el énfasis es mío):
Cada uno de estos contextos define el conjunto de miembros de la función candidata y la lista de argumentos en su propia forma única, como se describe en detalle en las secciones enumeradas anteriormente. Por ejemplo, el conjunto de candidatos para la invocación de un método no incluye los métodos marcados como anulación (§7.4) , y los métodos en una clase base no son candidatos si cualquier método en una clase derivada es aplicable (§7.6.5.1).