2000 के दशक में वापस मेरे एक सहकर्मी ने मुझे बताया कि यह सार्वजनिक तरीकों को आभासी या अमूर्त बनाने का एक विरोधी पैटर्न है।
उदाहरण के लिए, उन्होंने एक वर्ग को इस तरह से डिजाइन करने पर विचार किया:
public abstract class PublicAbstractOrVirtual
{
public abstract void Method1(string argument);
public virtual void Method2(string argument)
{
if (argument == null) throw new ArgumentNullException(nameof(argument));
// default implementation
}
}
उन्होंने कहा कि
- एक व्युत्पन्न वर्ग के डेवलपर जो कि लागू करता है
Method1और ओवरराइड करताMethod2है उसे तर्क सत्यापन को दोहराना पड़ता है। - मामले में आधार वर्ग के विकासकर्ता के अनुकूलन हिस्सा चारों ओर कुछ जोड़ने का निर्णय करता
Method1याMethod2बाद में, वह यह नहीं कर सकते।
इसके बजाय मेरे सहयोगी ने इस दृष्टिकोण का प्रस्ताव दिया:
public abstract class ProtectedAbstractOrVirtual
{
public void Method1(string argument)
{
if (argument == null) throw new ArgumentNullException(nameof(argument));
this.Method1Core(argument);
}
public void Method2(string argument)
{
if (argument == null) throw new ArgumentNullException(nameof(argument));
this.Method2Core(argument);
}
protected abstract void Method1Core(string argument);
protected virtual void Method2Core(string argument)
{
// default implementation
}
}
उन्होंने मुझे सार्वजनिक तरीके (या गुण) वर्चुअल या एब्सट्रेक्ट बनाने के बारे में बताया कि यह फ़ील्ड्स को सार्वजनिक करने जितना ही बुरा है। फ़ील्ड को गुणों में लपेटकर, यदि आवश्यक हो, तो बाद में उस फ़ील्ड तक किसी भी पहुंच को बाधित कर सकता है। सार्वजनिक आभासी / अमूर्त सदस्यों पर भी यही लागू होता है: उन्हें उसी तरह से लपेटना जैसा कि ProtectedAbstractOrVirtualकक्षा में दिखाया गया है , आधार वर्ग डेवलपर को किसी भी कॉल को इंटरसेप्ट करने की अनुमति देता है जो आभासी / सार विधियों में जाते हैं।
लेकिन मैं इसे डिज़ाइन गाइडलाइन के रूप में नहीं देखता। यहां तक कि Microsoft भी इसका पालन नहीं करता है: इसे Streamसत्यापित करने के लिए कक्षा पर एक नज़र डालें ।
उस गाइडलाइन से आप क्या समझते हैं? क्या इसका कोई मतलब है, या क्या आपको लगता है कि यह एपीआई को ओवरकंप्लीकेट कर रहा है?
protectedसबसे अधिक उपयोगी है जब आप सार वर्ग के निजी सदस्यों को व्युत्पन्न कक्षाओं में उजागर करना चाहते हैं। किसी भी मामले में, मैं विशेष रूप से आपके मित्र की राय के बारे में चिंतित नहीं हूं; पहुँच संशोधक चुनें जो आपकी विशेष स्थिति के लिए सबसे अधिक समझ में आता है।
virtualवैकल्पिक ओवरराइडिंग की अनुमति देती है। आपकी विधि संभवतः सार्वजनिक होनी चाहिए, क्योंकि यह ओवरराइड नहीं हो सकती है। विधियाँ बनानाabstractआपको उन्हें ओवरराइड करने के लिए मजबूर करता है; वे शायद होना चाहिएprotected, क्योंकि वे एकpublicसंदर्भ में विशेष रूप से उपयोगी नहीं हैं ।