तरीके एक अंतरफलक से लागू किया जाता है कि डिफ़ॉल्ट रूप से नहीं आभासी है। आप केवल इंटरफ़ेस परिभाषा में परिभाषित अनुबंध का कार्यान्वयन प्रदान कर रहे हैं। विधि को virtual
के रूप में चिह्नित करके, आप व्युत्पन्न कक्षाओं को परिभाषित किए गए अनुबंध को सम्मानित करते हुए अतिरिक्त या अलग कार्यान्वयन प्रदान करने की अनुमति दे रहे हैं।
interface IAnimal
{
string Speak();
}
class Dog : IAnimal
{
public string Speak()
{
return "Bark!";
}
}
Dog
वर्ग है इंटरफेस को लागू अनुबंध IAnimal
के एक कार्यान्वयन प्रदान करके:
इस उदाहरण पर विचार। यहां कोई वर्चुअल विधियां नहीं हैं और कोई ओवरराइड नहीं है।
interface IAnimal
{
string Speak();
}
class Dog : IAnimal
{
public virtual string Speak()
{
return "Bark!";
}
}
class GoldenRetriever : Dog
{
public override string Speak()
{
return "I am a golden retriever who says "
+ base.Speak();
}
}
अब Dog
वर्ग Speak
की घोषणा की है virtual
व्युत्पन्न की अनुमति देता है जो कक्षाएं एक अतिरिक्त या नए कार्यान्वयन प्रदान करने के लिए होने के लिए:
अब इस उदाहरण पर विचार करें। यह IAnimal
के साथ अनुबंध को तोड़ता नहीं है क्योंकि Speak
विधि पर कोई भी कॉल अभी भी एक स्ट्रिंग देता है।
ठीक है, एक आखिरी उदाहरण। याद रखें कि इंटरफेस को कार्यान्वयन की आवश्यकता नहीं है - उन्हें केवल आवश्यकता है कि अनुबंध संतुष्ट हो। इसका अर्थ यह है कि इंटरफेस केवल इस बात की परवाह करता है कि एक सदस्य कार्यान्वयन वर्ग में मौजूद है जिसमें मिलान करने वाला हस्ताक्षर है। इसका मतलब है कि हम भी ऐसा कर सकता है:
interface IAnimal
{
string Speak();
}
abstract class Dog : IAnimal
{
public abstract string Speak();
}
class GoldenRetriever : Dog
{
public override string Speak()
{
return "I am a golden retriever";
}
}
सूचना अब कि Dog
वर्ग बिल्कुल Speak
के लिए कोई कार्यान्वयन प्रदान करता है अभी तक अनुबंध की शर्तों को पूरा किया गया है।
इंटरफेस भी Dog
और GoldenRetriever
IAnimal
इंटरफ़ेस को लागू उपरोक्त दोनों सभी उदाहरणों में ऐसा वर्ग के लिए वर्ग से लिए गए हैं। न तो Speak
विधि छुपाएं - दोनों कक्षा लागू करें।
ठीक है, मुझे लगता है कि आपका भ्रम इस तथ्य से आ रहा है कि वर्चुअल विधि को एक इंटरफ़ेस में परिभाषित किया गया है, कक्षा नहीं।यहाँ आईएल इंटरफेस के लिए मैं ऊपर परिभाषित है:
.class private interface abstract auto ansi IAnimal
{
.method public hidebysig newslot abstract
virtual instance string Speak() cil managed
{
}
}
आप सही है कि विधि virtual
के रूप में आप भी सूचना के लिए उस प्रकार यहां एक interface
रूप में नामित है की जरूरत है परिभाषित किया गया है कर रहे हैं है। यह पूरी तरह से माइक्रोसॉफ्ट के सी # कंपाइलर द्वारा उत्पन्न एमएसआईएल का कार्यान्वयन विवरण है - एक और कंपाइलर आसानी से अलग-अलग कोड उत्पन्न कर सकता है जब तक कि अर्थात् यह वही परिणाम प्रदान करता है।
यहां महत्वपूर्ण बात यह है कि: इस विधि को इंटरफ़ेस में virtual
के रूप में घोषित किया गया है, इसका मतलब यह नहीं है कि यह कक्षा में घोषित virtual
विधि जैसा ही है।
वर्चुअल के बजाय, यह मानते हुए कि इंटरफ़ेस में विधियां डिफ़ॉल्ट रूप से सार होती हैं, और अधिक समझ में आता है। –
हाँ यह ठीक है लेकिन एक बार जब अनुयायी विधि के साथ वर्चुअल संलग्न करता है और विधि को कार्यान्वित करते समय आप वर्चुअल डाल रहे हैं तो शिकायतकर्ता को यह कहना चाहिए कि आप मूल घोषणा छुपा रहे हैं। –