सबसे आम व्यवहार inherited
पर कॉल करना है। इसलिए यदि मैं स्पष्ट रूप से वंचित व्यवहार नहीं चाहता हूं, तो मैं inherited
पर कॉल नहीं करता हूं। अन्यथा, मैं करता हूँ। यदि विरासत में व्यवहार TObject.Create/Destroy
जैसा नो-ऑप है, तो भी मैं inherited
पर कॉल करता हूं।
ध्यान दें कि रचनाकारों और विनाशकों के लिए अभिवादन शायद अन्य तरीकों से थोड़ा अलग है। यह असाधारण रूप से दुर्लभ है कि आपको विरासत विधि में कॉल छोड़ना होगा। मैं एक उदाहरण के बारे में नहीं सोच सकता। अनिवार्य रूप से रचनाकार अन्य वस्तुओं को बना रहे हैं और नष्ट कर रहे हैं, तो आप इसे छोड़ने पर विचार कैसे कर सकते हैं?
मुझे पता है कि कुछ लेखक को TObject
से प्राप्त करते समय कोड लिखते हैं, क्योंकि वे जानते हैं कि TObject
में कार्यान्वयन कुछ भी नहीं करता है। मुझे वह पसंद नहीं है और मेरे लिए यह करना एक गलती है। TObject
के कार्यान्वयन विवरण व्युत्पन्न कक्षाओं में लीक नहीं होना चाहिए।
मुझे पूरा यकीन है कि TObject.Create/Destroy
हमेशा नो-ऑप्स नहीं होगा। अगर एम्बरकेडेरो ने बदल दिया तो इतना कोड टूट जाएगा। लेकिन आपकी कक्षाओं में से एक के बारे में क्या। मान लें कि आपके पास TObject
से ली गई कक्षा है। और फिर आप एक और वर्ग है कि से ली गई है:
constructor TMyClass2.Create;
begin
// no need to call inherited, it's a no-op
FMyObj := TBlahBlah.Create;
end;
फिर एक दिन तुम क्या करने TMyClass1
निर्माता संशोधित:
TMyClass1 = class
....
end;
TMyClass2 = class(TMyClass)
....
end;
आप TMyClass1
के लिए कोई निर्माता और कहा कि इस तरह दिखता है TMyClass2
के लिए एक निर्माता है कुछ कुछ। अब TClass2
टूटा हुआ है। इसलिए, मैं कभी भी inherited
पर कॉल नहीं छोड़ूंगा क्योंकि वह कॉल कुछ भी नहीं करता है।
सामान्य उदाहरण विधियों की स्थिति थोड़ा अलग है। यह अधिक व्यावहारिक है कि आप बेस क्लास कार्यान्वयन को अनदेखा करना चाहते हैं और एक नया नया कार्यान्वयन प्रदान करना चाहते हैं। लेकिन इस बात के आधार पर फैसला लें कि व्युत्पन्न वर्ग क्या करना चाहता है इसके बजाए सुपर क्लास के पास विधि के लिए खाली कार्यान्वयन है या नहीं।
स्रोत
2013-04-19 11:53:06
+1 'कार्यान्वयन विवरण' भाग के लिए। दरअसल, आरटीएल का कुछ भविष्य संस्करण वास्तव में इन खाली तरीकों में कुछ महत्वपूर्ण कोड डालने का फैसला कर सकता है। –