2013-01-25 11 views
5

विरासत से अभिभावक वर्ग वर्चुअल विधि एक्सेस करें मैं जानना चाहता हूं कि विरासत वर्ग (जो विधि को ओवरराइड करता है) का उपयोग कर बेस वर्चुअल विधि तक पहुंच बनाना संभव है या नहीं।चाइल्ड क्लास ऑब्जेक्ट

मुझे पता है कि यह एक अच्छा अभ्यास नहीं है, लेकिन कारण यह है कि मैं यह जानना चाहता हूं कि यह तकनीकी रूप से संभव है। मैं जिज्ञासा से बाहर पूछकर, इस तरह के अभ्यास का पालन नहीं करता हूं।

मैंने कुछ समान प्रश्न देखे लेकिन मुझे वह जवाब नहीं मिला जो मैं ढूंढ रहा हूं।

उदाहरण:

public class Parent 
{ 
    public virtual void Print() 
    { 
     Console.WriteLine("Print in Parent"); 
    } 
} 

public class Child : Parent 
{ 
    public override void Print() 
    { 
     Console.WriteLine("Print in Child"); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Child c = new Child(); 
     //or Parent child = new Child(); 
     child.Print(); //Calls Child class method 
     ((Parent)c).Print(); //Want Parent class method call 
    } 
} 

कृपया downvotes समझाने। स्टैक ओवरफ्लो पर मौजूदा समान प्रश्न (संतोषजनक उत्तर के साथ) का कोई भी लिंक स्वीकार्य उत्तर है। धन्यवाद।

+0

मैं वस्तुतः एक ही सवाल कल यहां उत्तर दिया,; http://stackoverflow.com/questions/14491513/calling-both-base-and-derived-methods/14491581#14491581 –

+0

स्पष्ट रूप से अभिभावक वर्ग प्रिंट() विधि को कॉल करें। जाहिर है, जैसा कि आपने नोट किया है, यह आर्किटेक्चर पॉलिमॉर्फिक व्यवहार को उलट करने के प्रयास में है - बुद्धिमान –

+0

@ आदित्यसिहग नहीं; यह ओवरराइड तरीकों के लिए काम नहीं करता है। ऊपर दिए गए लिंक के अनुसार केवल 'नया'। –

उत्तर

4

जुड़ा हुआ डुप्लिकेट मैं के साथ टिप्पणी की प्रति के रूप में, आप इस तरह के रूप में कुछ प्रतिबिंब चाल के साथ यह कर सकते हैं:

static void Main(string[] args) 
{ 
    Child child = new Child(); 
    Action parentPrint = (Action)Activator.CreateInstance(typeof(Action), child, typeof(Parent).GetMethod("Print").MethodHandle.GetFunctionPointer()); 

    parentPrint.Invoke(); 
} 
+0

यह वही है जो मैं देख रहा था। साझा करने के लिए धन्यवाद। –

1

नहीं - बेस क्लास की वर्चुअल विधि का आह्वान करना संभव नहीं है - इस तरह के परिदृश्यों में विधि का सबसे व्युत्पन्न कार्यान्वयन किया जाता है। आपके द्वारा दिए गए उदाहरण में, यह दोनों मामलों में "Print in Child" प्रिंट करेगा।

+0

-1; हां यह ऊपर पोस्ट किए गए डुप्लिकेट लिंक के अनुसार है। –

+1

वास्तव में नहीं! नए कीवर्ड के साथ व्युत्पन्न कक्षा में एक ही हस्ताक्षर के साथ एक विधि बनाना आधार वर्ग में विधि को छाया या छुपा रहा है। इसका मतलब है कि आप व्युत्पन्न वर्ग से नई विधि का आह्वान कर रहे हैं न कि बेस क्लास की विधि। व्युत्पन्न वर्ग की अपनी नई विधि की तुलना में अपने प्रिंट स्टेटमेंट को अलग-अलग शाब्दिक बनाने के लिए बनाएं और इसे अपने लिए देखें! –

1
मेरे हिसाब से

, सबसे अच्छा तुम कर सकते है:

public class Parent 
{ 
    public virtual void Print() 
    { 
     Console.WriteLine("Print in Parent"); 
    } 
} 

public class Child : Parent 
{ 
    public override void Print() 
    { 
     base.Print(); 
     Console.WriteLine("Print in Child"); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Child c = new Child(); 
     //or Parent child = new Child(); 
     child.Print(); //Calls Child class method 
     ((Parent)c).Print(); //Want Parent class method call 
    } 
} 
+0

यह बिल्कुल मेरा कोड है। अगर यह काम करता, तो कोई सवाल नहीं था कि मैं एक सवाल पूछ रहा था। –

+0

कृपया चाइल्ड क्लास प्रिंट() में नामक आधार। प्रिंट() देखें।यह अपनी बेस क्लास प्रिंट विधि पर कॉल ट्रिगर करेगा। – mihirj

+0

क्षमा करें, मेरा बुरा। खैर, बच्चे से आधार विधि को बुलाओ मेरा इरादा नहीं है। मैं सोच रहा था कि क्या यह तकनीकी रूप से संभव था यदि आप किसी भी कक्षा में कोई कोड परिवर्तन नहीं कर सकते हैं। हालांकि उत्तर के लिए धन्यवाद। मैं इसकी सराहना करता हूं। –

0

मैं जब यह मददगार होगा पता नहीं होता। लेकिन एक सभ्य कामकाज या तो एक डमी विधि को ओवरलोड या लिखना हो सकता है जो केवल पिता वर्ग को बुलाता है। आपका मुख्य विधि में

public class Child : Parent 
{ 
    public void Print(bool onlyCallFather) 
    { 
    if(onlyCallFather) 
     base.Print(); 
    else 
     Print(); 
    } 
} 

और फिर:: यह कुछ इस तरह दिखेगा

class Program 
{ 
    static void Main(string[] args) 
    { 
     Child c = new Child(); 
     child.Print(false); //Calls Child class method 
     child.Print(true); //Calls only the one at father 
    } 
} 

तो यह है कि आप क्या करना चाहते थे करना होगा। मैंने वास्तव में यह बताने के लिए इस प्रकार के वर्कअराउंड को देखा है कि क्या आप मूल विधि को कॉल करना चाहते हैं या नहीं।

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