यह बात सबसे अच्छा है, जिनमें से नहीं है, लेकिन जब क्या उपयोग करने के लिए की।
'सामान्य' मामलों में एक साधारण प्रश्न यह पता लगाने के लिए पर्याप्त है कि हमें विरासत या एकत्रीकरण की आवश्यकता है या नहीं।
- नया वर्ग कम या ज्यादा मूल वर्ग के रूप में है। विरासत का प्रयोग करें। नई कक्षा अब मूल वर्ग का उप-वर्ग है।
- यदि नई कक्षा में मूल कक्षा है। एकत्रीकरण का प्रयोग करें। नई कक्षा में अब सदस्य के रूप में मूल वर्ग है।
हालांकि, एक बड़ा ग्रे क्षेत्र है। तो हमें कई अन्य चाल की जरूरत है।
- हम विरासत का इस्तेमाल किया है (या हम इसे उपयोग करने की योजना) लेकिन हम केवल इंटरफ़ेस का हिस्सा उपयोग करें, या हम कार्यक्षमता का एक बहुत ओवरराइड करने के लिए सह-संबंध तार्किक रखने के लिए मजबूर कर रहे हैं। तब हमारे पास एक बड़ी गंध है जो इंगित करती है कि हमें एकत्रीकरण का उपयोग करना पड़ा।
- यदि हमने एकत्रीकरण (या हम इसका उपयोग करने की योजना बना रहे हैं) का उपयोग किया है, लेकिन हमें पता चलता है कि हमें लगभग सभी कार्यक्षमताओं की प्रतिलिपि बनाने की आवश्यकता है। तब हमारे पास एक गंध है जो विरासत की दिशा में इंगित करती है।
इसे छोटा करने के लिए। इंटरफ़ेस का हिस्सा उपयोग नहीं किया जाता है या किसी अजीब स्थिति से बचने के लिए उसे बदला जाना चाहिए, तो हमें एकत्रीकरण का उपयोग करना चाहिए। हमें केवल विरासत का उपयोग करने की आवश्यकता है, अगर हमें बिना किसी बड़े बदलाव के लगभग सभी कार्यक्षमताओं की आवश्यकता है। और जब संदेह में, एकत्रीकरण का उपयोग करें।
एक अन्य संभावना है कि हमारे पास एक वर्ग है जो मूल वर्ग की कार्यक्षमता के हिस्से की आवश्यकता है, मूल वर्ग को मूल वर्ग और उप वर्ग में विभाजित करना है। और नए वर्ग को मूल वर्ग से प्राप्त करने दें। लेकिन आपको इसका ख्याल रखना चाहिए, न कि एक अलौकिक अलगाव पैदा करना।
चलिए एक उदाहरण जोड़ें। हमारे पास विधियों के साथ एक वर्ग 'कुत्ता' है: 'खाओ', 'चलना', 'छाल', 'प्ले'।
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;
यह बहुत साफ है। कोई आंतरिक कुत्ते नहीं। और बिल्लियों और कुत्ते एक ही स्तर पर हैं। हम मॉडल का विस्तार करने के लिए अन्य पालतू जानवर भी पेश कर सकते हैं। जब तक यह एक मछली नहीं है, या कुछ ऐसा नहीं है जो चलता नहीं है। उस मामले में हमें फिर से प्रतिक्रिया करने की आवश्यकता है। लेकिन यह एक और समय के लिए कुछ है।
के बजाय इंटरफ़ेस से भी विरासत का उपयोग कर रहे हैं, अच्छा सवाल है, दुर्भाग्यवश मेरे पास अब पर्याप्त समय नहीं है। –
एक अच्छा जवाब एक तेजी से एक से बेहतर मैं अपने खुद के प्रश्न देख रहे होंगे तो मैं आप को वोट देंगे कम से कम :-P –
अब यह विस्तार किया जाता है ;-) है ...। –