इंटरफ़ेस के लिए abstract
, या इसके अलावा public
कीवर्ड बेमानी होंगे, इसलिए आप उन्हें छोड़ देते हैं:
interface MyInterface {
void Method();
}
CIL में, विधि चिह्नित है virtual
और abstract
।
(ध्यान दें कि जावा इंटरफ़ेस सदस्यों को घोषित करने की अनुमति देता है 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
) है जो निजी पद्धति को संबंधित इंटरफ़ेस विधि से जोड़ देगा जो इसे लागू कर रहा है।
[सी#]
class MyClass : MyInterface {
void MyInterface.Method() {}
}
[सीआईएल]
.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
[सीआईएल]
.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 पर वर्चुअल चिह्नित किया जाना चाहिए, भले ही संकलक को इसे करने के लिए हुप्स से गुजरना पड़े।