2013-01-25 17 views
50

मान लीजिए अगर मैं नीचे के रूप में परिभाषित किया गया एक अंतरफलक है:सी # इंटरफ़ेस विरासत

public interface IFunctionality 
{ 
    void Method();  
} 

और मैं एक अमूर्त वर्ग के लिए इस इंटरफ़ेस को लागू के रूप में नीचे दिखाया गया है:

public abstract class AbstractFunctionality: IFunctionality 
{ 
    public void Method() 
    { 
     Console.WriteLine("Abstract stuff" + "\n"); 
    }  
} 
फिर

मैं एक है ठोस वर्ग जो नीचे के रूप में सार वर्ग से विरासत:

public class ConcreteFunctionality: AbstractFunctionality 
{ 
    public void Method() 
    { 
     Console.WriteLine("Concrete stuff" + "\n"); 
    } 
} 

अब मैं निम्नलिखित है सह डी,

ConcreteFunctionality mostDerived = new ConcreteFunctionality(); 
AbstractFunctionality baseInst = mostDerived; 
IFunctionality interfaceInst = mostDerived; 
mostDerived.Method(); 
baseInst.Method(); 
interfaceInst.Method(); 

इस सामान के निष्पादन के बाद जो उत्पादन हो रहा है वह निम्नानुसार है।

Concrete stuff 
Abstract stuff 
Abstract stuff 

लेकिन क्या मैं क्या मैं यहाँ कर रहा हूँ प्रकार AbstractFunctionality और IFunctionality की चर के ConcreteFunctionality के संदर्भ बताए है के रूप में सभी तीन मामलों में "कंक्रीट सामग्री" होने का उत्पादन की उम्मीद की है।

आंतरिक रूप से क्या हो रहा है। कृपया स्पष्ट करें।

+2

यह कुछ स्पष्ट हो सकता है: http://stackoverflow.com/questions/392721/difference-between-shadowing-and-overriding-in-c – Stormenet

+0

"यह छिपा हुआ है ओवरराइड नहीं" - एक अच्छा मंत्र याद करने के लिए। (लेकिन अपने संकलक इस उल्लेख किया जाना चाहिए था, आप अपनी चेतावनी फिल्टर करके निकाल करते है?) – kmote

उत्तर

74

यहाँ:

public class ConreteFunctionality:AbstractFunctionality 
{ 
    public void Method() 
    { 
     Console.WriteLine("Concrete stuff" + "\n"); 
    } 
} 

... आप अधिभावी नहीं कर रहे हैं मौजूदा विधि। आप नया विधि बना रहे हैं जो मौजूदा छुपाता है। (आपको new संशोधक के उपयोग का सुझाव देने पर भी एक चेतावनी मिलनी चाहिए, यदि आप वास्तव में यह व्यवहार चाहते हैं।) इंटरफ़ेस को AbstractFunctionality में कार्यान्वित किया गया था, इसलिए इंटरफ़ेस मैपिंग तालिका उस कक्षा में विधि को संदर्भित करती है।

अब

अगर आप reimplement इंटरफ़ेस:

public class ConcreteFunctionality : AbstractFunctionality, IFunctionality 

... तो इंटरफ़ेस मानचित्रण ConcreteFunctionality में विधि का उल्लेख होगा और आप व्यवहार आप इंटरफेस के माध्यम से कॉल के लिए उम्मीद मिलेगा (यानीआपका तीसरा कॉल) लेकिन आपको अभी भी आपकी दूसरी कॉल के लिए AbstractFunctionality में कार्यान्वयन मिल जाएगा।

यह आमतौर पर AbstractFunctionality वर्चुअल में विधि बनाने के लिए क्लीनर और अधिक स्वच्छता-संरक्षण होगा, और ConcreteFunctionality में इसे ओवरराइड करेगा। इस तरह यह सभी मामलों में ConcreteFunctionality कार्यान्वयन का उपयोग करेगा।

+1

वह व्यवहार की अपेक्षा नहीं करेगा, क्योंकि दूसरी कॉल अभी भी अमूर्त कार्यान्वयन के माध्यम से होगी। –

+0

@JonHanna: मैं उम्मीद है कि दूसरी कॉल * भी * ठोस संस्करण का प्रयोग करेंगे गौर नहीं किया था। संपादित करेंगे –

14

आप virtual और override कीवर्ड अनुपलब्ध हैं। इसके बिना आपको वर्चुअल फ़ंक्शन नहीं मिलते हैं।

आप virtual रूप AbstractFunctionality में Method चिह्नित करने और override रूप ConreteFunctionality में Method चिह्नित कर सकते हैं। जैसा कि मिहिरज दिखाया गया है। AbstractFunctionality के साथ जुड़े

public abstract class AbstractFunctionality:IFunctionality 
{ 
    public virtual void Method() 
    { 
     Console.WriteLine("Abstract stuff" + "\n"); 
    }  
} 

public class ConreteFunctionality:AbstractFunctionality 
{ 
    public override void Method() 
    { 
     Console.WriteLine("Concrete stuff" + "\n"); 
    } 
} 

आप ConreteFunctionality में विधि() ओवरराइड नहीं मिला, इसलिए रन टाइम वातावरण कार्यान्वित विधि(): -

इसी में घेरने की कोशिश की मुद्दों Why are C# interface methods not declared abstract or virtual?

+1

+1 दिलचस्प लिंक के लिए। – phoog

30

आप के रूप में वर्गों को परिभाषित करने की जरूरत है ऑब्जेक्ट के रूप में यह गतिशील बहुरूपता लागू नहीं कर सकते हैं। virtual और override पेश करने से रन क्लास पर्यावरण को बाल वर्ग में ओवरडिन विधि निष्पादित करने में सक्षम बनाता है।

+2

अच्छा जवाब; लेकिन मैं "छिपाने" शब्द का परिचय दूंगा, जो ओपी के मूल कोड का वर्णन करता है, और ध्यान दें कि संकलक चेतावनी में "नए" कीवर्ड परिणामों के बिना एक विधि छिपाना। – phoog

संबंधित मुद्दे