Por que o comportamento dos Métodos de Interface Padrão foi alterado no C # 8? No passado, o código a seguir (quando os métodos de interface padrão foram demo não lançados):
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();
}
}
tem a seguinte saída:
Saída do console:
Eu sou um método padrão na interface!
Eu sou um método padrão substituído!
Mas com a última versão do C # 8, o código acima está produzindo a seguinte saída:
Saída do console:
Eu sou um método padrão substituído!
Eu sou um método padrão substituído!
Alguém pode me explicar por que esse comportamento mudou?
Nota:
IDefaultInterfaceMethod anyClass = new AnyClass(); anyClass.DefaultMethod();
((IDefaultInterfaceMethod) anyClass).DefaultMethod(); // STILL the same problem!??
c#
c#-8.0
default-interface-member
Bassam Alugili
fonte
fonte
Cut base() syntax for C# 8. We intend to bring this back in the next major release.
. Isso exigiria suporte de tempo de execução para funcionar corretamente.virtual
eu acho? E possivelmente introduzindo um diamante de herançaRespostas:
Eu suspeito que uma pergunta melhor seria:
O recurso foi planejado, mas foi cortado do C # 8 em abril de 2019 , porque uma implementação eficiente exigiria suporte do tempo de execução. Isso não pôde ser adicionado antes do lançamento. O recurso teria que funcionar bem para C # e VB.NET - F # não gosta de interfaces de qualquer maneira.
Ele funcionará através de uma
base()
chamada semelhante à forma como as aulas funcionam. Copiando o exemplo da proposta:fonte
Why would you do that?
. Então eu descobri a ata da reunião