2008-10-18 11 views
5

मैं प्रवीण < IMyInterface> से एक वर्ग प्राप्त करना चाहता था, लेकिन ऐसा लगता है कि < को सील कर दिया गया है। मेरे मामले में मैं बस निर्दिष्ट कार्य के उलटा (!) परिणाम वापस करना चाहता था। मेरे पास लक्ष्य पूरा करने के अन्य तरीके हैं। मेरा सवाल यह है कि <> को सील करने का निर्णय लेने पर एमएस डिजाइनर क्या सोच रहे हैं?क्यों भविष्यवाणी की जाती है <> मुहरबंद?

बहुत विचार के बिना मैं के साथ आया था: (क) उनके परीक्षण, सिर्फ एक समय बनाम लागत व्यापार को सरल बनाया बंद (ख) "अच्छा नहीं" विधेय < से>

पाने से आ सकता है तुम क्या करते सोच?

अद्यतन: शुरुआती चरण के दौरान भविष्यवाणियों की सूची में गतिशील रूप से जोड़े गए एन भविष्यवाणियां हैं। प्रत्येक पारस्परिक रूप से अनन्य है (यदि एबीसी जोड़ा जाता है, तो NotAbc जोड़ा नहीं जाएगा)। मैं एक पैटर्न ऐसा दिखता है जैसे मनाया:

bool Happy(IMyInterface I) {...} 
bool NotHappy(IMyInterface I) { return !Happy(I); } 
bool Hungry(IMyInterface I) {...} 
bool NotHungry(IMyInterface I) { return !Hungry(I); } 
bool Busy(IMyInterface I) {...} 
bool NotBusy(IMyInterface I) { return !Busy(I); } 
bool Smart(IMyInterface I) {...} 
bool NotSmart(IMyInterface I) {...} //Not simply !Smart 

इसकी नहीं है कि मैं समस्या का समाधान नहीं कर सकते हैं, इसके कि मुझे आश्चर्य है कि क्यों मैं इसे एक निश्चित तरीके से हल नहीं कर सकता है।

+0

जब आपने कहा "उलटा" मुझे यकीन नहीं था कि आपका क्या मतलब है। मेरे लिए, ए से बी के फ़ंक्शन के विपरीत बी से ए का एक फ़ंक्शन है, मुझे लगता है कि "अस्वीकृत" स्पष्ट हो सकता है। आप वास्तव में क्या देख रहे हैं? –

+0

मुझे खेद है, लेकिन आपके अपडेट होने के बाद, मुझे समझ में नहीं आता कि सवाल क्या है: क्या आप पूछ रहे हैं कि प्रतिनिधियों की सूची कैसे है और उन लोगों के लिए जो मौजूद नहीं हैं - आप अस्वीकृत प्रतिनिधि को जोड़ते हैं? –

उत्तर

4

भविष्यवाणी एक प्रतिनिधि है। आप एक प्रतिनिधि प्रकार से उत्तराधिकारी नहीं हो सकते हैं। आप उल्टे मूल्य प्राप्त करना चाहते हैं, का उपयोग करें:

Predicate<T> p; 
Predicate<T> inverted = t => !p(t); 
19

Predicate<T> एक प्रतिनिधि प्रकार है। आप कभी प्रतिनिधियों से प्राप्त नहीं कर सकते हैं।

ईमानदार होने के लिए, यह ऐसा नहीं लगता है कि विरासत वास्तव में यहां उचित है - बस एक विधि लिखें जो मूल के विपरीत हो। यह इस रूप में सरल है:

public static Predicate<T> Invert<T>(Predicate<T> original) 
{ 
    return t => !original(t); 
} 
2

एक प्रतिनिधि की कार्यक्षमता प्रकार सुरक्षित तरीका संकेत की एक सूची को संभालने के लिए है। सी # डिजाइनरों ने फैसला किया है कि इस कार्यक्षमता में जोड़ने के लिए कुछ भी नहीं है और व्यवहार को प्रतिनिधियों को बदलने का कोई कारण नहीं है।

तो, जॉन सही है, विरासत यहां उचित नहीं है।

प्रतिनिधि विधियों की एक सूची को इंगित कर सकते हैं। हम इस सूची में + = ऑपरेटर के साथ या Delegate.Combine के साथ जोड़ते हैं। यदि विधि का हस्ताक्षर शून्य नहीं है तो अंतिम आवंटित विधि का परिणाम वापस कर दिया जाता है (यदि सही ढंग से याद किया जाता है)।

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