पृष्ठभूमि
यहां मैं वास्तविक समस्या पर काम कर रहा हूं: मैं कार्ड गेम मैजिक: द गैदरिंग में कार्ड का प्रतिनिधित्व करने का एक तरीका चाहता हूं । खेल के अधिकांश कार्ड सामान्य दिखने वाले कार्ड हैं, लेकिन उनमें से कुछ को दो भागों में विभाजित किया गया है, प्रत्येक का अपना नाम है। इन दो-भाग कार्डों में से प्रत्येक को एक कार्ड के रूप में माना जाता है। तो स्पष्टता के लिए, मैं 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
"भौतिक कार्ड" के रूप में, अच्छी तरह से, ज्यादातर कार्ड दोनों हैं! मुझे लगता है कि आप एक तर्क दे सकते हैं कि भौतिक कार्ड वास्तव में वैचारिक कार्ड होते हैं, और वे एक ही चीज नहीं हैं , लेकिन मैं तर्क दूंगा कि वे हैं।
टाइप-कास्टिंग की आवश्यकता
क्योंकि PartialCard
s और WholeCards
दोनों Card
s हैं, और आमतौर पर उन्हें अलग करने का कोई अच्छा कारण नहीं है, मैं सामान्य रूप से बस काम करूंगा Collection<Card>
। तो कभी-कभी मुझे PartialCard
उनके अतिरिक्त तरीकों का उपयोग करने के लिए एस डालना होगा । अभी, मैं यहाँ वर्णित प्रणाली का उपयोग कर रहा हूँ क्योंकि मुझे स्पष्ट जातियाँ पसंद नहीं हैं। और जैसे Card
, वास्तविक या वे प्रतिनिधित्व करने के लिए उपयोग करने के लिए या Representative
तो डाली जाएगी ।WholeCard
Composite
Card
तो बस सारांश के लिए:
- आधार प्रकार
Representative
- आधार प्रकार
Card
- प्रकार
WholeCard extends Card, Representative
(कोई पहुंच की आवश्यकता नहीं है, यह स्वयं का प्रतिनिधित्व करता है) - प्रकार
PartialCard extends Card
(अन्य भाग तक पहुँच देता है) - प्रकार
Composite extends Representative
(दोनों भागों तक पहुँच देता है)
क्या यह पागल है? मुझे लगता है कि यह वास्तव में बहुत मायने रखता है, लेकिन मुझे ईमानदारी से यकीन नहीं है।