Pourquoi le comportement des méthodes d'interface par défaut est-il modifié en C # 8? Dans le passé, le code suivant (lorsque la démonstration des méthodes d'interface par défaut n'était pas publiée):
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();
}
}
a la sortie suivante:
Sortie console:
Je suis une méthode par défaut dans l'interface!
Je suis une méthode par défaut remplacée!
Mais avec la dernière version C # 8, le code ci-dessus produit la sortie suivante:
Sortie console:
Je suis une méthode par défaut remplacée!
Je suis une méthode par défaut remplacée!
N'importe qui peut m'expliquer pourquoi ce comportement a changé?
Remarque:
IDefaultInterfaceMethod anyClass = new AnyClass(); anyClass.DefaultMethod();
((IDefaultInterfaceMethod) anyClass).DefaultMethod(); // STILL the same problem!??
c#
c#-8.0
default-interface-member
Bassam Alugili
la source
la source
Cut base() syntax for C# 8. We intend to bring this back in the next major release.
. Cela nécessiterait un support d'exécution pour fonctionner correctement.virtual
je suppose? Et éventuellement l'introduction d'un diamant d'héritageRéponses:
Je soupçonne qu'une meilleure question serait:
La fonctionnalité a été planifiée mais a été coupée de C # 8 en avril 2019 , car une implémentation efficace nécessiterait le support du runtime. Cela n'a pas pu être ajouté à temps avant la sortie. La fonctionnalité devrait bien fonctionner à la fois pour C # et VB.NET - F # n'aime pas les interfaces de toute façon.
Cela fonctionnera par le biais d'un
base()
appel similaire au fonctionnement des classes. Coopérer l'exemple de proposition:la source
Why would you do that?
. Puis j'ai découvert le procès