2012-09-07 3 views
10

मैं निम्नलिखित वर्गों/इंटरफेस:सी # जेनेरिक बाधा - वर्तमान वर्ग प्रकार का संदर्भ कैसे लें?

public abstract class AbstractBasePresenter<T> : IPresenter<T> 
    where T : class, IView 
{ 
} 

public interface IPresenter<T> 
{ 
} 

public interface IView<TV, TE, TP> : IView 
    where TV : IViewModel 
    where TE : IEditModel 
    //where TP : AbstractBasePresenter<???> 
{ 
} 

public interface IView {} 

वहाँ किसी भी तरह से है कि मैं IVIEW <> पर टी.पी. विवश कर सकते हैं एक वर्ग है कि AbstractBasePresenter से विरासत होने के लिए है?

या गैर-जेनेरिक आईपेंडर इंटरफ़ेस बनाने का मेरा एकमात्र विकल्प है और फिर इसे लागू करने के लिए प्रतिनिधि प्रस्तुत करें और फिर "टीपी: प्रतिनिधि" चेक का उपयोग करें?

धन्यवाद

अद्यतन:

नीचे

प्रस्तावित जवाब काम नहीं करता:

public interface IView<TV, TE, TP> : IView 
where TV : IViewModel 
where TE : IEditModel 
where TP : AbstractBasePresenter<IView<TV,TE,TP>> 
{ 
} 

मैं इंटरफ़ेस घोषणा की है के रूप में:

public interface IInsuredDetailsView : IView<InsuredDetailsViewModel, InsuredDetailsEditModel, IInsuredDetailsPresenter> 
{ } 

public interface IInsuredDetailsPresenter : IPresenter<IInsuredDetailsView> 
{ } 

संकलक शिकायत है कि IInsuredDetailsPresenter को आबंटित नहीं है सारबेस प्रतिनिधि>

+0

'सार BasePresenter' क्या' टी' के साथ? सी # में सामान्य प्रकार के उदाहरणों की कोई अवधारणा नहीं है जिसके लिए कुछ प्रकार के पैरामीटर सेट नहीं किए गए हैं। –

+0

'जहां टीपी: सारबेज प्रतिनिधि >' संकलित करता है लेकिन मुझे यकीन नहीं है कि यह परिणाम आपको जो परिणाम चाहिए वह प्रदान करेगा ... – nemesv

+1

एक टिप्पणी के रूप में, निम्नलिखित संरचना अधिक जटिल है और यह समझना मुश्किल है कि यह क्या हो सकता है के लिए उपयोगी। – Andrey

उत्तर

2

तुम कर सकते हो, लेकिन आप IView<> इंटरफेस के लिए एक और प्रकार तर्क प्रदान करने की आवश्यकता:

public interface IView<TV, TE, TP, T> : IView 
    where TV : IViewModel 
    where TE : IEditModel 
    where TP : AbstractBasePresenter<T> 
    where T : class, IView 
{ 
} 

संपादित करें:

अपने प्रश्न में संस्करणों के अनुसार: IInsuredDetailsPresenter निश्चित रूप से आबंटित नहीं है AbstractBasePresenter पर। आपके मूल प्रश्न में आपके द्वारा अनुरोध की गई बाधा के कारण कंपाइलर शिकायत कर रहा है। अधिक विशेष रूप से की वजह से इस हिस्से

where TP : AbstractBasePresenter<T> 

को ऐसा लगता है आप TP विवश करने के लिए एक अंतरफलक के रूप में अच्छी तरह से होना चाहता हूँ। आप कोड के नीचे टुकड़ा कोशिश कर सकते हैं: T पर

public interface IView<TV, TE, TP, T> : IView 
    where TV : IViewModel 
    where TE : IEditModel 
    where TP : IPresenter<T> 
{ 
} 

प्रतिबन्ध नहीं की जरूरत है, क्योंकि कोई भी IPresenter<T> है। बेशक, आप armen.shimoon के जवाब को इसी तरह से अनुकूलित कर सकते हैं। बिंदु IPresenter<T> बाधा के साथ AbstractBasePresenter<T> बाधा को प्रतिस्थापित करना है।

+0

आपका कोड संकलित नहीं करता है। आप एक 'जहां टी: IView' – nemesv

+0

@nemesv गायब हैं: सच है, धन्यवाद – pbalaga

+0

मुझे नहीं लगता कि आपको चौथा सामान्य पैरामीटर जोड़ने की आवश्यकता है। –

4

कोई बात नहीं, एक और सामान्य पैरामीटर के लिए कोई जरूरत नहीं:

public interface IView<TV, TE, TP> : IView 
    where TV : IViewModel 
    where TE : IEditModel 
    where TP : AbstractBasePresenter<IView<TV,TE,TP>> 
{ 
} 

संपादित करें: अपडेट किया गया प्रश्न:

:

आप AbstractBasePresenter से इनहेरिट करना प्रस्तोता की जरूरत नहीं है, करने के लिए कोड बदलने

public interface IView<TV, TE, TP> : IView 
    where TV : IViewModel 
    where TE : IEditModel 
    where TP : IPresenter<IView<TV,TE,TP>> 
{ 
} 
+0

आपका समाधान अच्छा है कि पूर्ण रूप से दृढ़ता से समर्थित समर्थन की आवश्यकता नहीं है। (आपके पास इस पर कोई नियंत्रण नहीं है कि 'सारणीबेस प्रस्तुतकर्ता' में 'टी' वास्तव में क्या है।) – pbalaga

+1

यह काम नहीं करता है। उपरोक्त संपादित प्रश्न देखें। – Rezler