2012-01-30 21 views
10

से बाल वर्ग विधि को कॉल करना क्या A.doStuff() विधि को ए क्लास को संपादित किए बिना "बी डॉट स्टफ" प्रिंट करना संभव है? यदि हां, तो मैं यह कैसे करूँगा?अभिभावक

class Program 
{ 
    static void Main(string[] args) 
    { 
     A a = new A(); 
     B b = new B(); 

     a.doStuff(); 
     b.doStuff(); 

     Console.ReadLine(); 
    } 
} 

class A 
{ 
    public void doStuff() 
    { 
     Console.WriteLine("A did stuff"); 
    } 
} 

class B : A 
{ 
    public void doStuff() 
    { 
     Console.WriteLine("B did stuff"); 
    } 
} 

मैं स्टीम गेम, टेरेरिया को संशोधित कर रहा हूं। और मैं इसे सभी को हटाना और पुन: संकलित नहीं करना चाहता क्योंकि यह भाप के साथ पेंच जाएगा। मेरा कार्यक्रम एक्सएनए के माध्यम से टेरेरिया में इंजेक्ट करता है। मैं कुछ चीजों को संशोधित करने के लिए एक्सएनए से अपडेट() और ड्रा() विधियों का उपयोग कर सकता हूं। लेकिन यह बहुत सीमित है। मैं अधिक चीजों को संशोधित करने के लिए आधार विधियों को ओवरराइड नहीं करना चाहता (उदाहरण के लिए worldgen)।

उत्तर

13

हाँ, आप A में virtual और फिर B में override रूप doStuff यह घोषणा करते हैं।

class A 
{ 
    public virtual void doStuff() 
    { 
     Console.WriteLine("A did stuff"); 
    } 
} 

class B : A 
{ 
    public override void doStuff() 
    { 
     Console.WriteLine("B did stuff"); 
    } 
} 
+0

चूंकि एडोस्टफ सिर्फ ओवरराइड होने के लिए है, यह आभासी के बजाय सार होना चाहिए। –

2

चूंकि बी प्रभावी रूप से विरासत के माध्यम से ए है और विधि अधिभारित है।

A a = new B(); 
a.doStuff(); 
+2

बेशक इसे आभासी और ओवरराइड द्वारा किया जा सकता है, लेकिन यह अनुरोध करने के लिए ऐसा करने का एकमात्र तरीका है ए के रूप में अनुरोध किया गया OP –

+0

धन्यवाद, लेकिन मैं इसे भी नहीं कर सकता। मुझे शायद ओपी में इसे स्पष्ट करना चाहिए था; मैं एक भाप खेल, टेरेरिया modding कर रहा हूँ। और मैं इसे सभी को हटाना और पुन: संकलित नहीं करना चाहता क्योंकि यह भाप के साथ पेंच जाएगा। मेरा कार्यक्रम एक्सएनए के माध्यम से टेरेरिया में इंजेक्ट करता है। मैं कुछ चीजों को संशोधित करने के लिए एक्सएनए से अपडेट() और ड्रा() विधियों का उपयोग कर सकता हूं। लेकिन यह बहुत सीमित है। मैं अधिक चीजों को संशोधित करने के लिए आधार विधियों को ओवरराइड नहीं करना चाहता (उदाहरण के लिए worldgen)। – user1178494

+0

@ user1178494 मेरे अपडेट किए गए उत्तर को नए कीवर्ड के उपयोग के साथ देखें जो मदद कर सकता है। – VS1

0

वर्ग के लिए कोड एक & बी आप वैसे भी संकलक चेतावनी नीचे उत्पन्न होगा पोस्ट किया है और वर्ग बी पर new कीवर्ड का उपयोग करने के लिए कहेगा, हालांकि यह संकलन होगा: 'पर कीवर्ड नई आवश्यक है B.doStuff() 'क्योंकि गुप्त रखता है विरासत में मिला सदस्य' A.doStuff() '

उपयोग method hiding साथ वर्ग मैपर और वर्ग बी में new और virtual कीवर्ड के साथ इस प्रकार है:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Mapper a = new B(); //notice this line 
     B b = new B(); 

     a.doStuff(); 
     b.doStuff(); 

     Console.ReadLine(); 
    } 
} 

class A 
{ 
    public void doStuff() 
    { 
     Console.WriteLine("A did stuff"); 
    } 
} 

class Mapper : A 
{ 
    new public virtual void doStuff() //notice the new and virtual keywords here which will all to hide or override the base class implementation 
    { 
     Console.WriteLine("Mapper did stuff"); 
    } 
} 

class B : Mapper 
{ 
    public override void doStuff() 
    { 
     Console.WriteLine("B did stuff"); 
    } 
} 
+0

धन्यवाद, लेकिन यह अभी भी a.doStuff() को कॉल करते समय "ए डू स्टफ" प्रिंट करेगा। – user1178494

+0

@ user1178494 मैंने अपना जवाब अपडेट कर लिया है, कृपया इसे आज़माएं और ए और बी कक्षाओं के बीच मैपर (मध्यस्थ) वर्ग के उपयोग पर ध्यान दें, कृपया देखें कि क्या यह आपकी समस्या हल करता है .. – VS1

+0

यह अभी भी काम नहीं करता है, दुख की बात है। मेरी मदद करने के लिए फिर से धन्यवाद। – user1178494

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