인터페이스의 경우 추가 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
private 메서드를 구현중인 해당 인터페이스 메서드에 연결 하는 CIL 지시문 ( )이 있기 때문에 가능합니다 .
[씨#]
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에서 가상으로 표시되어야합니다.