2010-02-20 11 views
14

मैं आज कुछ कोड समीक्षा कर रहा था और कुछ डेवलपर द्वारा लिखे गए पुराने कोड में आया था। यह हो जाता है कुछ इस तरहआंतरिक सार तरीकों। किसी के पास क्यों होगा?

public abstract class BaseControl 
{ 
    internal abstract void DoSomething(); 
} 

आप एक ही विधानसभा के भीतर एक व्युत्पन्न वर्ग है, तो यह

public class DerivedControl : BaseControl 
{ 
    internal override void DoSomething() 
    { 
    } 
} 

काम करेगा लेकिन एक अलग विधानसभा में आधार वर्ग पाने संकलन समय त्रुटि

देना होगा
DerivedControl does not implement inherited abstract member 'BaseControl.DoSomething() 

मुझे यह सोचने लगा। कोई भी आंतरिक सार के रूप में एक विधि क्यों घोषित करेगा?

उत्तर

12

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

+0

यह एक बुरा विचार नहीं हो सकता है जब तक कि आप तीसरी पार्टी लाइब्रेरी में इस संवेदी धारणा में भाग लेते हैं। यह अक्सर अनावश्यक नकल का एक टन का मतलब है। (DevExpress, मैं आपको देख रहा हूँ ...) – jnm2

1

मेरी प्रारंभिक प्रतिक्रिया यह थी कि यदि आप बाहरी विरासत को रोकना चाहते हैं तो कोई अच्छा कारण नहीं है, तो आपको कक्षा को आंतरिक चिह्नित करना चाहिए। लेकिन इसका मतलब है कि कक्षा पूरी तरह से अन्य असेंबली के लिए छिपी हुई है।

मुझे लगता है कि यह विधि दृश्यता बनाए रखने के दौरान बाहरी विरासत को रोकती है।

+1

नहीं - यदि आप बाह्य विरासत को रोकना चाहते हैं, तो आप निर्माता को आंतरिक बनाते हैं। आपको पूरी कक्षा को आंतरिक बनाने की आवश्यकता नहीं है। – RobSiklos

+0

कक्षा को आंतरिक बनाने और आंतरिक बनाने के बीच अंतर क्या है? – RSB

+0

@RobSiklos किस परिदृश्य में, कक्षा को आंतरिक बनाना चाहिए – RSB

6

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

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

0

एक विधि को आंतरिक सार के रूप में परिभाषित करके आप यह सुनिश्चित करना चाहते हैं कि एक ही असेंबली में केवल कक्षा ही आपकी विधि के लिए कार्यान्वयन कर सके।

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

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