2010-04-20 16 views
22

मैं आधार वर्गविरासत में मिला अधिभावी सामान्य तरीकों

protected virtual bool HasAnyStuff<TObject>(TObject obj) where TObject:class 
    { 
     return false; 
    } 

में इस कोड को बच्चा कक्षा में मैं

protected override bool HasAnyStuff<Customer>(Customer obj) 
    { 
    //some stuff 
     if Customer.sth etc 
     return false; 
    } 

अधिभावी कर रहा हूँ मैं यह त्रुटि

'' 'प्रकार पैरामीटर हो रही है घोषणा एक पहचानकर्ता नहीं होना चाहिए '' '

मैं यहाँ क्या गलत कर रहा हूं?

उत्तर

39

आप व्युत्पन्न कक्षा में एक सामान्य विधि के प्रकार पैरामीटर को ओवरराइड नहीं कर सकते हैं। एक इसी तरह की सुविधा प्राप्त करने के लिए, एक ही विकल्प बिल्कुल के आधार पर अपने आधार वर्ग एक सामान्य वर्ग है, और अपने व्युत्पन्न वर्ग जैसे

class Derived : BaseClass<Customer> 
{ 
    protected override bool HasAnyStuff(Customer customer) 
    { 
     // ... 
    } 
} 

जहां BaseClass रूप

class BaseClass<T> where T : class 
{ 
    // ... 
    protected virtual bool HasAnyStuff(T obj) 
    { 
     // ... 
    } 
} 

वैकल्पिक रूप से घोषित किया जाता है के लिए, है आपकी व्युत्पन्न कक्षा का उपयोग कैसे किया जा रहा है, आप गैर-जेनेरिक Customer तर्क के साथ HasAnyStuff विधि को ओवरराइड कर सकते हैं।

public bool HasAnyStuff(Customer customer) 
{ 
    // ... 
} 

हालांकि, ध्यान दें कि नई HasAnyStuff अगर आप DerivedClass का एक उदाहरण के साथ काम नहीं कर रहे हैं कहा जाता है नहीं किया जाएगा। यही कारण है, कहने के लिए

BaseClass foo = new DerivedClass(); 
foo.HasAnyStuff(new Customer()); 

BaseClass की सामान्य विधि, नहीं DerivedClass की गैर सामान्य विधि कॉल करेंगे।

0

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

class BaseClass 
{ 
    protected virtual bool HasAnyStuff<TObject>(TObject obj) 
    { 
     return false; 
    } 
} 

class DerivedClass : BaseClass 
{ 
    protected override bool HasAnyStuff<TObject>(TObject obj) 
    { 
     if (typeof(TObject) != typeof(AlarmTran)) return base.HasAnyStuff<TObject>(obj); 

     //some stuff 
     //if Customer.sth etc 
     return false; 
    } 
} 

तुम भी कई अलग अलग प्रकार के लिए कई ओवरराइड को संभालने के लिए if तर्क को उलटने के हो सकते हैं।

protected override bool HasAnyStuff<TObject>(TObject obj) 
{ 
    if (typeof(TObject) == typeof(AlarmTran)) 
    { 
     //some stuff 
     //if Customer.sth etc 
     return false; 
    } 
    else if (typeof(TObject) == typeof(...)) 
    { 
     ... 
     return ...; 
    } 

    return base.HasAnyStuff<TObject>(obj); 
} 
0

जॉन कारपेंटर की जवाब देने के लिए इसी प्रकार, आप एक ही सामान्य विधि के साथ सामान्य विधि ओवरराइड कर सकते हैं, लेकिन बस की जाँच करें और इच्छित प्रकार के लिए यह कास्ट करने के लिए as ऑपरेटर का उपयोग करें। रूपांतरण के काम को जांचने के लिए इसमें नल-परीक्षण का उपयोग करने का अतिरिक्त लाभ है।

बेस कक्षा

protected virtual bool HasAnyStuff<TObject>(TObject obj) 
{ 
    .... // base implementation 
} 

विरासत में प्राप्त कक्षा

protected override bool HasAnyStuff<TObject>(TObject obj) 
{ 
    var customer = obj as Customer; 
    if (customer == null) // conversion failed. object is not of type Customer 
    { 
     return base.HasAnyStuff(obj); 
    } 

    .... // do stuff with the customer 
} 
संबंधित मुद्दे