2016-08-30 14 views
22

मैं निम्नलिखित श्रेणियां होती हैं:विधि ओवरलोडिंग और विरासत

public class BaseRepository 
{ 
    public virtual void Delete(int id) 
    { 
     Console.WriteLine("Delete by id in BaseRepository"); 
    } 
} 

public class EFRepository: BaseRepository 
{ 
    public override void Delete(int id) 
    { 
     Console.WriteLine("Delete by Id in EFRepository"); 
    } 

    public void Delete(object entity) 
    { 
     Console.WriteLine("Delete by entity in EFRepository"); 
    } 
} 

तब मुझे यह पसंद का उपयोग करें:

var repository = new EFRepository(); 
int id = 1; 
repository.Delete(id); 

उस मामले में क्यों केवल EFRepository.Delete(object entity) फोन करेगा?

+0

ऑब्जेक्ट एक int रख सकता है। –

+0

@TravisJ मुझे यह अच्छी तरह से पता है लेकिन सवाल थोड़ा अलग था – Marusyk

उत्तर

26

असल में, जिस तरह से विधि मंगलाचरण सी में काम करता है # कि संकलक पहले सबसे व्युत्पन्न वर्ग पर ध्यान देती है, और देखता है कि किसी भी नव घोषित तरीकों (ओवरराइड शामिल नहीं) कॉल के लिए तर्क के लिए लागू होते हैं। यदि कम से कम एक लागू विधि है, तो ओवरलोड रिज़ॉल्यूशन काम करता है जो सबसे अच्छा है। यदि ऐसा नहीं है, तो यह बेस क्लास की कोशिश करता है, और इसी तरह।

मैं सहमत हूं कि यह आश्चर्यजनक है - यह "भंगुर आधार वर्ग" मुद्दे का मुकाबला करने का प्रयास है, लेकिन मैं व्यक्तिगत रूप से पसंद करता हूं कि ओवरराइड विधियों के सेट में विधियों को शामिल किया गया था।

विधि आमंत्रण सी # 5 विनिर्देश के खंड 7.6.5.1 में वर्णित है। यहाँ प्रासंगिक भागों है:

  • उम्मीदवार तरीकों के सेट सबसे व्युत्पन्न प्रकार से केवल तरीकों को रोकने के लिए कम हो जाता है: सेट, जहां C प्रकार है जिसमें विधि F है में प्रत्येक विधि C.F के लिए घोषित किया गया, C के आधार प्रकार में घोषित सभी विधियों को सेट से हटा दिया गया है। इसके अलावा, यदि C ऑब्जेक्ट के अलावा एक वर्ग प्रकार है, तो इंटरफ़ेस प्रकार में घोषित सभी विधियों को सेट से हटा दिया जाता है। (यह बाद नियम केवल प्रभावित कर जब विधि समूह एक प्रकार वस्तु और एक गैर खाली प्रभावी इंटरफेस के अलावा अन्य के लिए एक प्रभावी आधार वर्ग होने पैरामीटर पर एक सदस्य देखने का परिणाम था है।)

और में 7.4 के सदस्य देखने हिस्सा है, override तरीकों को स्पष्ट रूप से निकाल दिए जाते हैं:

सदस्य है कि एक override संशोधक शामिल सेट से बाहर रखा गया है।

+0

स्पष्टीकरण के लिए धन्यवाद। तो, int पैरामीटर के साथ विधि को कॉल करने का कोई तरीका नहीं है, है ना? – Marusyk

+1

@ मेगाट्रॉन: आपको पहले बेस रेपॉजिटरी में डालना होगा। –

+0

धन्यवाद। मुझे लगता है कि उस डिजाइन को बदलने के लिए बेहतर होगा – Marusyk

0

क्योंकि: सार्वजनिक ओवरराइड शून्य हटाएँ (पूर्णांक आईडी) केवल आधार वर्ग विधि जो एक स्थान पर आ जाएगी: सार्वजनिक आभासी शून्य हटाएँ (पूर्णांक आईडी)।

सार्वजनिक शून्य हटाएँ जबकि (वस्तु इकाई) EFRepository वर्ग विधि, इसलिए जब आप EFRepository वस्तु से विधि निष्पादित यह खुद के लागू करेगा विधि जो लेकिन सार्वजनिक शून्य हटाएँ (वस्तु इकाई) कुछ भी नहीं है

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