c# - सार कक्षा में सी#इंटरफ़ेस विरासत




oop interface (2)

मान लीजिए कि मेरे पास नीचे परिभाषित एक इंटरफेस है:

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

लेकिन मैं तीनों मामलों में आउटपुट को "कंक्रीट स्टफ" होने की उम्मीद कर रहा हूं, जैसा कि मैं यहां कर रहा हूं, ConcreteFunctionality IFunctionality का संदर्भ AbstractFunctionality IFunctionality और IFunctionality के चर के लिए असाइन कर रहा है।

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


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

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

इसी तरह के मुद्दों में निपटाया गया - सी # इंटरफ़ेस विधियों को अमूर्त या वर्चुअल घोषित क्यों नहीं किया जाता है?


आपको कक्षाओं को परिभाषित करने की आवश्यकता है:

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");
    }
}

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





concrete