Para la interfaz, la adición de la abstract
, o incluso las palabras clave public
sería redundante, por lo que los omite:
interface MyInterface {
void Method();
}
En el CIL, el método está marcado virtual
y abstract
.
(Tenga en cuenta que Java permite que los miembros de la interfaz se declaren public abstract
).
Para la clase de aplicación, hay algunas opciones:
no reemplazable: En C# la clase no declarar el método como virtual
. Eso significa que no puede ser anulado en una clase derivada (solo oculta). En el CIL, el método sigue siendo virtual (pero sellado) porque debe soportar el polimorfismo en relación con el tipo de interfaz.
class MyClass : MyInterface {
public void Method() {}
}
Overridable: Tanto en C# y en el CIL el método es virtual
. Participa en el envío polimórfico y puede anularse.
class MyClass : MyInterface {
public virtual void Method() {}
}
explícita: Esta es una manera para que una clase para implementar una interfaz, pero no proporciona los métodos de interfaz en la interfaz pública de la propia clase. En el CIL, el método será private
(!) Pero aún así se podrá llamar desde fuera de la clase desde una referencia al tipo de interfaz correspondiente. Las implementaciones explícitas tampoco son invalidables. Esto es posible porque hay una directiva CIL (.override
) que enlazará el método privado con el método de interfaz correspondiente que está implementando.
[C#]
class MyClass : MyInterface {
void MyInterface.Method() {}
}
[CIL]
.method private hidebysig newslot virtual final instance void MyInterface.Method() cil managed
{
.override MyInterface::Method
}
En VB.NET, incluso se puede alias el nombre de método de interfaz en la clase que implementa.
[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
}
Ahora, considere este caso raro:
interface MyInterface {
void Method();
}
class Base {
public void Method();
}
class Derived : Base, MyInterface { }
Si Base
Derived
y se declaran en el mismo conjunto , el compilador hará Base::Method
virtual y sellado (en el CIL), aunque Base
no implementa la interfaz.
Si Base
Derived
y se encuentran en diferentes montajes, al compilar el conjunto Derived
, el compilador no cambia el otro conjunto, por lo que introducirá un miembro de Derived
que será una implementación explícita para MyInterface::Method
que se acaba de delegar la llama al Base::Method
.
Como puede ver, cada implementación del método interfaz debe apoyar el comportamiento polimórfico, y por lo tanto debe ser marcada virtual en el CIL, incluso si el compilador debe pasar por el aro para hacerlo.
porque están declarados como interfaz –
@Muad: Ver mi edición. –