¿Por qué se cambia el comportamiento de los métodos de interfaz predeterminados en C # 8? En el pasado, el siguiente código (cuando no se lanzó la demostración de los métodos de interfaz predeterminados):
interface IDefaultInterfaceMethod
{
// By default, this method will be virtual, and the virtual keyword can be here used!
virtual void DefaultMethod()
{
Console.WriteLine("I am a default method in the interface!");
}
}
interface IOverrideDefaultInterfaceMethod : IDefaultInterfaceMethod
{
void IDefaultInterfaceMethod.DefaultMethod()
{
Console.WriteLine("I am an overridden default method!");
}
}
class AnyClass : IDefaultInterfaceMethod, IOverrideDefaultInterfaceMethod
{
}
class Program
{
static void Main()
{
IDefaultInterfaceMethod anyClass = new AnyClass();
anyClass.DefaultMethod();
IOverrideDefaultInterfaceMethod anyClassOverridden = new AnyClass();
anyClassOverridden.DefaultMethod();
}
}
tiene el siguiente resultado:
Salida de consola:
¡Soy un método predeterminado en la interfaz!
¡Soy un método predeterminado anulado!
Pero con la última versión de C # 8, el código anterior produce el siguiente resultado:
Salida de consola:
¡Soy un método predeterminado anulado!
¡Soy un método predeterminado anulado!
¿Alguien puede explicarme por qué se cambia este comportamiento?
Nota:
IDefaultInterfaceMethod anyClass = new AnyClass(); anyClass.DefaultMethod();
((IDefaultInterfaceMethod) anyClass).DefaultMethod(); // STILL the same problem!??
c#
c#-8.0
default-interface-member
Bassam Alugili
fuente
fuente
Cut base() syntax for C# 8. We intend to bring this back in the next major release.
. Esto requeriría soporte de tiempo de ejecución para funcionar correctamente.virtual
que supongo? Y posiblemente introduciendo un diamante de herenciaRespuestas:
Sospecho que una mejor pregunta sería:
La función se planificó, pero se eliminó de C # 8 en abril de 2019 , porque una implementación eficiente requeriría soporte del tiempo de ejecución. Esto no se pudo agregar a tiempo antes del lanzamiento. La característica tendría que funcionar bien tanto para C # como para VB.NET: a F # no le gustan las interfaces de todos modos.
Funcionará a través de una
base()
llamada similar a cómo funcionan las clases. Copiando el ejemplo de propuesta:fuente
Why would you do that?
. Luego descubrí las minutas de la reunión