พื้นหลัง
นี่คือปัญหาที่เกิดขึ้นจริงผมทำงานเกี่ยวกับ: ฉันต้องการวิธีที่จะเป็นตัวแทนของบัตรในเกมบัตรเวทมนตร์: กลุ่ม การ์ดส่วนใหญ่ในเกมเป็นการ์ดที่ดูธรรมดา แต่บางการ์ดก็แบ่งออกเป็นสองส่วนแต่ละการ์ดมีชื่อเป็นของตัวเอง ครึ่งหนึ่งของการ์ดสองส่วนเหล่านี้ถือว่าเป็นการ์ด ดังนั้นเพื่อความชัดเจนฉันจะใช้Cardเพื่ออ้างถึงสิ่งที่เป็นการ์ดปกติหรือครึ่งหนึ่งของการ์ดสองส่วน (ในคำอื่น ๆ บางสิ่งที่มีเพียงชื่อเดียว)

ดังนั้นเราจึงมีฐานเป็นการ์ด วัตถุประสงค์ของวัตถุเหล่านี้เป็นเพียงการเก็บคุณสมบัติของการ์ดเท่านั้น พวกเขาไม่ได้ทำอะไรด้วยตนเอง
interface Card {
String name();
String text();
// etc
}
มีคลาสย่อยสองชั้นCardซึ่งฉันกำลังเรียกPartialCard(ครึ่งหนึ่งของการ์ดสองส่วน) และWholeCard(การ์ดปกติ) PartialCardมีสองวิธีเพิ่มเติม: และPartialCard otherPart()boolean isFirstPart()
สภาผู้แทนราษฎร
ถ้าฉันมีดาดฟ้ามันควรจะประกอบด้วยWholeCards ไม่ใช่Cards อย่างที่Cardควรจะเป็นPartialCardและนั่นก็ไม่สมเหตุสมผล ดังนั้นฉันต้องการวัตถุที่แสดงถึง "บัตรทางกายภาพ" นั่นคือสิ่งที่สามารถเป็นตัวแทนหนึ่งWholeCardหรือสองPartialCards ฉันไม่แน่นอนโทรประเภทนี้Representativeและจะมีวิธีการที่Card จะให้ข้อมูลที่เกือบจะไม่มีโดยตรงบนบัตร (s) มันหมายถึงมันเท่านั้นที่จะชี้ไปที่มัน / พวกเขา ตอนนี้คิดที่ยอดเยี่ยม / บ้า / ใบ้ของฉัน (คุณตัดสินใจ) เป็นที่สืบทอด WholeCard จากทั้งสองและ ท้ายที่สุดพวกเขาเป็นการ์ดที่แสดงตัวของพวกเขาเอง! WholeCards สามารถใช้เป็นgetRepresentative()Representative CardRepresentativegetRepresentativereturn this;
สำหรับPartialCardsพวกเขาไม่ได้เป็นตัวแทนของตัวเอง แต่พวกเขามีภายนอกRepresentativeที่ไม่ได้เป็นCardแต่มีวิธีการในการเข้าถึงทั้งสองPartialCards
ฉันคิดว่าลำดับชั้นของประเภทนี้สมเหตุสมผล แต่มันซับซ้อน ถ้าเราคิดว่าCards เป็น "บัตรเชิงแนวคิด" และRepresentatives เป็น "บัตรทางกายภาพ" ก็เป็นได้ทั้งการ์ดส่วนใหญ่! ฉันคิดว่าคุณสามารถโต้แย้งได้ว่าจริง ๆ แล้วบัตรทางกายภาพนั้นมีบัตรแนวคิดอยู่และมันไม่เหมือนกันแต่ฉันจะเถียงว่าเป็น
ความจำเป็นของการหล่อแบบ
เพราะPartialCardและWholeCardsมีทั้งCards Collection<Card>และมีเหตุผลที่มักจะไม่ดีที่จะแยกพวกเขาออกมาผมได้ตามปกติเพียงแค่ได้ร่วมงานกับ ดังนั้นบางครั้งฉันจำเป็นต้องส่งPartialCardเพื่อเข้าถึงวิธีการเพิ่มเติม ตอนนี้ฉันกำลังใช้ระบบที่อธิบายไว้ที่นี่เพราะฉันไม่ชอบนักแสดงที่ชัดเจน และชอบCard, Representativeจะต้องถูกทิ้งไปอย่างใดอย่างหนึ่งWholeCardหรือCompositeการเข้าถึงที่เกิดขึ้นจริงCardของพวกเขาเป็นตัวแทน
ดังนั้นเพียงเพื่อสรุป:
- ประเภทฐาน
Representative - ประเภทฐาน
Card - ประเภท
WholeCard extends Card, Representative(ไม่จำเป็นต้องเข้าถึงมันแสดงถึงตัวเอง) - ประเภท
PartialCard extends Card(ให้การเข้าถึงส่วนอื่น ๆ ) - ประเภท
Composite extends Representative(ให้การเข้าถึงทั้งสองส่วน)
นี่มันบ้าเหรอ? ฉันคิดว่ามันสมเหตุสมผลจริงๆ แต่ฉันก็ไม่แน่ใจจริงๆ