สำหรับอินเทอร์เฟซการเพิ่มabstract
หรือแม้แต่public
คำหลักจะซ้ำซ้อนดังนั้นคุณจึงละเว้น:
interface MyInterface {
void Method();
}
ใน CIL วิธีการทำเครื่องหมายและvirtual
abstract
(โปรดทราบว่า Java อนุญาตให้ประกาศสมาชิกอินเตอร์เฟสได้public abstract
)
สำหรับคลาสการใช้งานมีตัวเลือกบางอย่าง:
Non-overridable : ใน C # คลาสไม่ได้ประกาศเมธอดเป็นvirtual
. นั่นหมายความว่าไม่สามารถแทนที่ในคลาสที่ได้รับ (ซ่อนไว้เท่านั้น) ใน CIL เมธอดยังคงเป็นเสมือน (แต่ปิดผนึก) เนื่องจากต้องรองรับความหลากหลายเกี่ยวกับประเภทอินเทอร์เฟซ
class MyClass : MyInterface {
public void Method() {}
}
Overridable : ทั้งสองใน C # และ CIL virtual
วิธีคือ มีส่วนร่วมในการจัดส่งหลายรูปแบบและสามารถลบล้างได้
class MyClass : MyInterface {
public virtual void Method() {}
}
Explicit : นี่เป็นวิธีสำหรับคลาสในการใช้อินเทอร์เฟซ แต่ไม่ได้จัดเตรียมเมธอดอินเตอร์เฟสในอินเทอร์เฟซสาธารณะของคลาสเอง ใน CIL เมธอดจะเป็นprivate
(!) แต่จะยังสามารถเรียกใช้ได้จากภายนอกคลาสจากการอ้างอิงถึงประเภทอินเทอร์เฟซที่เกี่ยวข้อง การใช้งานที่ชัดเจนยังไม่สามารถเขียนทับได้ สิ่งนี้เป็นไปได้เนื่องจากมีคำสั่ง CIL ( .override
) ที่จะเชื่อมโยงเมธอดส่วนตัวกับวิธีอินเทอร์เฟซที่เกี่ยวข้องซึ่งกำลังใช้งานอยู่
[ค#]
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 แม้ว่าคอมไพเลอร์จะต้องผ่านห่วงเพื่อทำก็ตาม