पृष्ठभूमि
यहां मैं वास्तविक समस्या पर काम कर रहा हूं: मैं कार्ड गेम मैजिक: द गैदरिंग में कार्ड का प्रतिनिधित्व करने का एक तरीका चाहता हूं । खेल के अधिकांश कार्ड सामान्य दिखने वाले कार्ड हैं, लेकिन उनमें से कुछ को दो भागों में विभाजित किया गया है, प्रत्येक का अपना नाम है। इन दो-भाग कार्डों में से प्रत्येक को एक कार्ड के रूप में माना जाता है। तो स्पष्टता के लिए, मैं Cardकेवल कुछ का उल्लेख करने के लिए उपयोग करूंगा जो या तो एक नियमित कार्ड है, या दो-भाग कार्ड का आधा (दूसरे शब्दों में, केवल एक नाम के साथ कुछ)।

इसलिए हमारे पास आधार प्रकार, कार्ड है। इन वस्तुओं का उद्देश्य वास्तव में कार्ड के गुणों को धारण करना है। वे वास्तव में खुद से कुछ नहीं करते हैं।
interface Card {
String name();
String text();
// etc
}
दो उपवर्ग हैं Card, जिन्हें मैं PartialCard(दो-भाग कार्ड का आधा) और WholeCard(एक नियमित कार्ड) कह रहा हूं । PartialCardदो अतिरिक्त विधियाँ हैं: PartialCard otherPart()और boolean isFirstPart()।
प्रतिनिधियों
अगर मेरे पास एक डेक है, तो यह WholeCardएस से बना होना चाहिए , Cardएस नहीं , जैसा कि एक Cardहो सकता है PartialCard, और इससे कोई मतलब नहीं होगा। इसलिए मैं एक ऐसी वस्तु चाहता हूं जो "भौतिक कार्ड" का प्रतिनिधित्व करती हो, यानी वह चीज जो एक WholeCardया दो PartialCardएस का प्रतिनिधित्व कर सकती है । मैं अस्थायी रूप से इस प्रकार को बुला रहा हूं Representative, और Cardइसका तरीका होगा getRepresentative()। A Representativeकार्ड पर लगभग कोई प्रत्यक्ष जानकारी प्रदान नहीं करेगा, जो इसका प्रतिनिधित्व करता है, यह केवल उसे / उन्हें इंगित करेगा। अब, मेरा शानदार / पागल / गूंगा विचार (आप तय करते हैं) यह है कि होलकार्ड दोनों से विरासत में मिले Cardऔर Representative। आखिरकार, वे कार्ड हैं जो खुद का प्रतिनिधित्व करते हैं! WholeCards के getRepresentativeरूप में लागू कर सकता है return this;।
के रूप में PartialCards, वे खुद का प्रतिनिधित्व नहीं करते हैं, लेकिन उनके पास एक बाहरी है Representativeजो एक नहीं है Card, लेकिन दो PartialCardएस तक पहुंचने के लिए तरीके प्रदान करता है ।
मुझे लगता है कि इस प्रकार का पदानुक्रम समझ में आता है, लेकिन यह जटिल है। यदि हम Card"वैचारिक कार्ड" के रूप में सोचते हैं और Representative"भौतिक कार्ड" के रूप में, अच्छी तरह से, ज्यादातर कार्ड दोनों हैं! मुझे लगता है कि आप एक तर्क दे सकते हैं कि भौतिक कार्ड वास्तव में वैचारिक कार्ड होते हैं, और वे एक ही चीज नहीं हैं , लेकिन मैं तर्क दूंगा कि वे हैं।
टाइप-कास्टिंग की आवश्यकता
क्योंकि PartialCards और WholeCardsदोनों Cards हैं, और आमतौर पर उन्हें अलग करने का कोई अच्छा कारण नहीं है, मैं सामान्य रूप से बस काम करूंगा Collection<Card>। तो कभी-कभी मुझे PartialCardउनके अतिरिक्त तरीकों का उपयोग करने के लिए एस डालना होगा । अभी, मैं यहाँ वर्णित प्रणाली का उपयोग कर रहा हूँ क्योंकि मुझे स्पष्ट जातियाँ पसंद नहीं हैं। और जैसे Card, वास्तविक या वे प्रतिनिधित्व करने के लिए उपयोग करने के लिए या Representativeतो डाली जाएगी ।WholeCardCompositeCard
तो बस सारांश के लिए:
- आधार प्रकार
Representative - आधार प्रकार
Card - प्रकार
WholeCard extends Card, Representative(कोई पहुंच की आवश्यकता नहीं है, यह स्वयं का प्रतिनिधित्व करता है) - प्रकार
PartialCard extends Card(अन्य भाग तक पहुँच देता है) - प्रकार
Composite extends Representative(दोनों भागों तक पहुँच देता है)
क्या यह पागल है? मुझे लगता है कि यह वास्तव में बहुत मायने रखता है, लेकिन मुझे ईमानदारी से यकीन नहीं है।