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