對於接口,添加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
(!),但它仍然可以從類的外部從對相應接口類型的引用中調用。顯式實現也是不可覆蓋的。這是可能的,因爲有一個CIL指令(.override
)將把私有方法鏈接到它正在實現的相應接口方法。
[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虛擬,即使編譯器必須經過箍做到這一點。
因爲它們被聲明爲接口 – 2010-09-01 19:22:21
@Muad:請參閱我的編輯。 – 2010-09-01 19:24:49