Pour l'interface, l'ajout de l' abstract
, ou même l' public
mots clés serait redondante, vous omettez:
interface MyInterface {
void Method();
}
Dans le CIL, la méthode est marquée virtual
et abstract
.
(Notez que Java permet aux membres d'interface afin d'être déclarée public abstract
).
Pour la mise en œuvre de la classe, il y a quelques options:
Non substituables: En C# la classe de ne pas déclarer la méthode virtual
. Ce qui signifie qu'il ne peut pas être redéfinie dans une classe dérivée (seulement caché). Dans le CIL de la méthode est encore virtuel (mais scellée), car il doit prendre en charge le polymorphisme concernant le type d'interface.
class MyClass : MyInterface {
public void Method() {}
}
Substituables: à la Fois en C# et dans le CIL de la méthode est - virtual
. Il participe à des polymorphes de répartition et elle peut être remplacée.
class MyClass : MyInterface {
public virtual void Method() {}
}
Explicite: C'est une façon pour qu'une classe implémente une interface, mais ne pas fournir les méthodes d'interface dans l'interface publique de la classe elle-même. Dans le CIL de la méthode sera private
(!) mais il faudra encore être appelée à partir de l'extérieur de la classe à partir d'une référence à l'interface correspondante type. Explicite implémentations sont également non-substituables. Cela est possible parce qu'il y a un CIL de la directive (.override
) qui fera le lien entre la méthode privée à l'interface correspondante méthode de mise en œuvre.
[C#]
class MyClass : MyInterface {
void MyInterface.Method() {}
}
[CIL]
.method private hidebysig newslot virtual final instance void MyInterface.Method() cil managed
{
.override MyInterface::Method
}
Dans VB.NET vous pouvez même alias l'interface nom de la méthode dans la mise en œuvre de la classe.
[VB.NET]
Public Class MyClass
Implements MyInterface
Public Sub AliasedMethod() Implements MyInterface.Method
End Sub
End Class
[CIL]
.method public newslot virtual final instance void AliasedMethod() cil managed
{
.override MyInterface::Method
}
Maintenant, pensez à cette étrange affaire:
interface MyInterface {
void Method();
}
class Base {
public void Method();
}
class Derived : Base, MyInterface { }
Si Base
et Derived
sont déclarées dans la même assemblée, le compilateur fera Base::Method
virtuel et scellé (CIL), même si l' Base
n'implémente pas l'interface.
Si Base
et Derived
sont dans les différentes assemblées, lors de la compilation de l' Derived
de l'assemblée, le compilateur ne va pas changer l'autre assemblée, de sorte qu'il présentera un membre en Derived
qui sera une mise en œuvre explicite pour MyInterface::Method
qui va juste déléguer l'appel d' Base::Method
.
Donc, vous voyez, chaque méthode de l'interface de mise en œuvre doit prendre en charge le comportement polymorphique, et doit donc être marqué virtuel sur le CIL, même si le compilateur doit passer à travers des cerceaux pour le faire.