インターフェイスの場合、の追加abstract
、またはpublic
キーワードでさえ冗長になるため、それらを省略します。
interface MyInterface {
void Method();
}
CILでは、メソッドはとマークされvirtual
ていabstract
ます。
(Javaではインターフェイスメンバーを宣言できることに注意してくださいpublic abstract
)。
実装クラスには、いくつかのオプションがあります。
オーバーライド不可:C#では、クラスはメソッドをとして宣言しませんvirtual
。つまり、派生クラスではオーバーライドできません(非表示のみ)。CILでは、インターフェイスの種類に関する多態性をサポートする必要があるため、メソッドは依然として仮想です(ただし、シールされています)。
class MyClass : MyInterface {
public void Method() {}
}
オーバーライド可能:C#とCILの両方でメソッドはvirtual
です。ポリモーフィックディスパッチに参加し、オーバーライドできます。
class MyClass : MyInterface {
public virtual void Method() {}
}
明示的:これは、クラスがインターフェースを実装する方法ですが、クラス自体のパブリックインターフェースにインターフェースメソッドを提供しません。CILでは、メソッドはprivate
(!)になりますが、対応するインターフェイスタイプへの参照から、クラスの外部から呼び出すことができます。明示的な実装もオーバーライドできません。これは.override
、プライベートメソッドを、実装している対応するインターフェイスメソッドにリンクするCILディレクティブ()があるために可能です。
[C#]
class MyClass : MyInterface {
void MyInterface.Method() {}
}
[CIL]
.method private hidebysig newslot virtual final instance void MyInterface.Method() cil managed
{
.override MyInterface::Method
}
VB.NETでは、実装クラスのインターフェイスメソッド名にエイリアスを設定することもできます。
[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
}
今、この奇妙なケースを考えてみましょう:
interface MyInterface {
void Method();
}
class Base {
public void Method();
}
class Derived : Base, MyInterface { }
Base
およびDerived
が同じアセンブリで宣言されている場合、インターフェイスを実装していなくBase::Method
ても、コンパイラーは仮想化して(CILで)シールBase
します。
場合Base
とDerived
異なるアセンブリにあるコンパイルする際、Derived
アセンブリ、それはにメンバーをご紹介しますので、コンパイラは、他のアセンブリを変更しないDerived
ために、明示的な実装されることをMyInterface::Method
それはちょうどへの呼び出しを委任しますBase::Method
。
ご覧のとおり、コンパイラがフープを通過する必要がある場合でも、すべてのインターフェイスメソッドの実装はポリモーフィックな動作をサポートする必要があるため、CILで仮想としてマークする必要があります。