मैं जावा पृष्ठभूमि से आ रहा हूं लेकिन मुझे पूरा विश्वास है कि एक ही सिद्धांत पायथन में लागू होगा। अंगूठे के नियम के रूप में आपको कभी किसी वर्ग से प्राप्त नहीं होना चाहिए जिसका कार्यान्वयन आप समझ में नहीं आता है और तब तक नियंत्रित नहीं करता जब तक वह वर्ग विशेष रूप से विरासत के लिए डिज़ाइन नहीं किया गया हो। यदि इसे इस तरह से डिजाइन किया गया है तो इसे इसके दस्तावेज़ीकरण में स्पष्ट रूप से वर्णन करना चाहिए।
इसका कारण यह है कि विरासत संभावित रूप से उस वर्ग के कार्यान्वयन विवरण से आपको बाध्य कर सकती है जिसे आप विरासत में प्राप्त कर रहे हैं।
जोश बलोच की किताब से एक उदाहरण का उपयोग करने के लिए 'प्रभावी जावा'
हम क्रम में वर्ग ArrayList
वर्ग का विस्तार करने के लिए आइटम है कि अपने जीवन समय के दौरान यह करने के लिए जोड़ा गया था की संख्या की गणना करने में सक्षम हो तो (जरूरी नहीं कि वर्तमान में इसमें मौजूद संख्या) हम इस तरह कुछ लिखने के लिए लुभाने वाले हो सकते हैं।
public class CountingList extends ArrayList {
int counter = 0;
public void add(Object o) {
counter++;
super.add(0);
}
public void addAll(Collection c) {
count += c.size();
super.addAll(c);
}
// Etc.
}
अब यह एक्सटेंशन ऐसा लगता है कि यह सूची में जोड़े गए तत्वों की संख्या को सटीक रूप से गिनता है लेकिन वास्तव में ऐसा नहीं हो सकता है। यदि ArrayList
ने addAll
को Collection
पर प्रदान करके लागू किया है और प्रत्येक तत्व के लिए अपनी इंटरफ़ेस विधि addAll
पर कॉल किया है तो हम addAll
विधि के माध्यम से जोड़े गए प्रत्येक तत्व को गिनेंगे। अब हमारी कक्षा का व्यवहार ArrayList
के कार्यान्वयन विवरण पर निर्भर है।
यह List
के अन्य कार्यान्वयनों को हमारे CountingList
कक्षा के साथ उपयोग करने में सक्षम नहीं होने के नुकसान के अतिरिक्त है। इसके अलावा ऊपर चर्चा की गई एक ठोस वर्ग से विरासत के नुकसान।
यह मेरी समझ है कि पायथन जावा के समान (यदि समान नहीं है) विधि प्रेषण तंत्र का उपयोग करता है और इसलिए उसी सीमाओं के अधीन होगा। अगर कोई पाइथन में एक उदाहरण प्रदान कर सकता है तो मुझे यकीन है कि यह और भी उपयोगी होगा।
स्रोत
2008-11-21 03:48:15