यह कोई बात नहीं है कि कौन सा सबसे अच्छा है, लेकिन कब क्या उपयोग करना है।
'सामान्य' मामलों में एक साधारण प्रश्न यह जानने के लिए पर्याप्त है कि क्या हमें विरासत या एकत्रीकरण की आवश्यकता है।
- नया वर्ग तो है मूल वर्ग के रूप में कम या ज्यादा। विरासत का उपयोग करें। नया वर्ग अब मूल वर्ग का उपवर्ग है।
- नया वर्ग चाहिए है मूल वर्ग। एकत्रीकरण का उपयोग करें। नए वर्ग में अब मूल वर्ग एक सदस्य के रूप में है।
हालांकि, एक बड़ा ग्रे क्षेत्र है। इसलिए हमें कई अन्य ट्रिक्स चाहिए।
- यदि हमने इनहेरिटेंस का उपयोग किया है (या हम इसका उपयोग करने की योजना बनाते हैं) लेकिन हम केवल इंटरफ़ेस के भाग का उपयोग करते हैं, या हम सहसंबंध को तार्किक रखने के लिए बहुत अधिक कार्यक्षमता को ओवरराइड करने के लिए मजबूर हैं। फिर हमारे पास एक बड़ा गंदा गंध है जो इंगित करता है कि हमें एकत्रीकरण का उपयोग करना था।
- यदि हमने एकत्रीकरण का उपयोग किया है (या हम इसका उपयोग करने की योजना बनाते हैं) लेकिन हमें पता चलता है कि हमें लगभग सभी कार्यक्षमता की प्रतिलिपि बनाने की आवश्यकता है। फिर हमारे पास एक गंध है जो विरासत की दिशा में इंगित करता है।
इसे छोटा करने के लिए। यदि इंटरफ़ेस का हिस्सा उपयोग नहीं किया गया है या एक अतार्किक स्थिति से बचने के लिए हमें परिवर्तित होना चाहिए तो हमें एकत्रीकरण का उपयोग करना चाहिए। हमें केवल विरासत का उपयोग करने की आवश्यकता है, अगर हमें बड़े बदलाव के बिना लगभग सभी कार्यक्षमता की आवश्यकता है। और जब संदेह में, एकत्रीकरण का उपयोग करें।
इसके लिए एक अन्य संभावना, यह मामला कि हमारे पास एक वर्ग है जिसे मूल वर्ग की कार्यक्षमता का हिस्सा चाहिए, मूल वर्ग को मूल वर्ग और एक उप वर्ग में विभाजित करना है। और नए वर्ग को मूल वर्ग से विरासत में मिला। लेकिन आपको इस बात का ध्यान रखना चाहिए, न कि एक अतार्किक अलगाव पैदा करना चाहिए।
एक उदाहरण जोड़ते हैं। हमारे पास विधियों के साथ एक वर्ग 'डॉग' है: 'खाओ', 'चलो', 'बार्क', 'खेलो'।
class Dog
Eat;
Walk;
Bark;
Play;
end;
हमें अब एक वर्ग 'कैट' की आवश्यकता है, जिसे 'ईट', 'वॉक', 'पूर' और 'प्ले' की आवश्यकता है। इसलिए पहले इसे डॉग से बढ़ाने की कोशिश करें।
class Cat is Dog
Purr;
end;
लगता है, ठीक है, लेकिन रुको। यह बिल्ली बार्क (बिल्ली प्रेमी मुझे उसके लिए मार देगा)। और एक भौंकने वाली बिल्ली ब्रह्मांड के सिद्धांतों का उल्लंघन करती है। इसलिए हमें बार्क विधि को ओवरराइड करने की आवश्यकता है ताकि यह कुछ भी न करे।
class Cat is Dog
Purr;
Bark = null;
end;
ठीक है, यह काम करता है, लेकिन यह बदबू आ रही है। तो एक एकत्रीकरण की कोशिश करते हैं:
class Cat
has Dog;
Eat = Dog.Eat;
Walk = Dog.Walk;
Play = Dog.Play;
Purr;
end;
ठीक है, यह अच्छा है। यह बिल्ली अब भौंकती नहीं है, चुप भी नहीं। लेकिन फिर भी इसमें एक आंतरिक कुत्ता है जो बाहर चाहता है। तो समाधान नंबर तीन आज़माएं:
class Pet
Eat;
Walk;
Play;
end;
class Dog is Pet
Bark;
end;
class Cat is Pet
Purr;
end;
यह बहुत क्लीनर है। कोई आंतरिक कुत्ते नहीं। और बिल्ली और कुत्ते एक ही स्तर पर हैं। हम मॉडल का विस्तार करने के लिए अन्य पालतू जानवरों को भी पेश कर सकते हैं। जब तक कि यह एक मछली नहीं है, या ऐसा कुछ जो नहीं चलता है। उस मामले में हमें फिर से विचार करने की आवश्यकता है। लेकिन यह एक अन्य समय के लिए कुछ है।