Dlaczego zachowanie domyślnych metod interfejsu zostało zmienione w C # 8? W przeszłości następujący kod (gdy domyślne metody interfejsu nie były udostępniane):
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();
}
}
ma następujące dane wyjściowe:
Dane wyjściowe konsoli:
Jestem domyślną metodą w interfejsie!
Jestem przesłoniętą metodą domyślną!
Ale w ostatniej wersji C # 8 powyższy kod generuje następujące dane wyjściowe:
Dane wyjściowe konsoli:
Jestem przesłoniętą metodą domyślną!
Jestem przesłoniętą metodą domyślną!
Czy ktoś może mi wyjaśnić, dlaczego to zachowanie się zmieniło?
Uwaga:
IDefaultInterfaceMethod anyClass = new AnyClass(); anyClass.DefaultMethod();
((IDefaultInterfaceMethod) anyClass).DefaultMethod(); // STILL the same problem!??
c#
c#-8.0
default-interface-member
Bassam Alugili
źródło
źródło
Cut base() syntax for C# 8. We intend to bring this back in the next major release.
. Wymagałoby to wsparcia środowiska wykonawczego do poprawnego działania.virtual
Chyba? I ewentualnie wprowadzenie diamentu spadkowegoOdpowiedzi:
Podejrzewam, że lepszym pytaniem byłoby:
Ta funkcja została zaplanowana, ale została usunięta z C # 8 w kwietniu 2019 r. , Ponieważ wydajne wdrożenie wymagałoby wsparcia ze strony środowiska wykonawczego. Nie można tego dodać na czas przed wydaniem. Ta funkcja musiałaby działać dobrze zarówno dla C #, jak i VB.NET - F # i tak nie lubi interfejsów.
Będzie działał przez
base()
wywołanie podobne do działania klas. Kopiowanie przykładu propozycji:źródło
Why would you do that?
. Potem dowiedziałem się o spotkaniu