Arka fon
İşte üzerinde çalıştığım asıl sorun: Kart oyunu Magic: The Gathering'de kartları temsil etmenin bir yolunu istiyorum . Oyundaki çoğu kart normal görünümlü kartlardır, ancak bazıları her biri kendi adına sahip iki bölüme ayrılmıştır. Bu iki parçalı kartların her bir yarısı kartın kendisi olarak kabul edilir. Netleştirmek için, Cardsadece normal bir kart veya iki parçalı bir kartın yarısını (başka bir deyişle, sadece bir isimle) ifade etmek için kullanacağım .

Yani baz tipimiz var, Card. Bu nesnelerin amacı gerçekten sadece kartın özelliklerini tutmaktır. Gerçekten kendi başlarına hiçbir şey yapmıyorlar.
interface Card {
String name();
String text();
// etc
}
CardAradığım iki alt sınıf var PartialCard(iki parçalı kartın yarısı) ve WholeCard(normal kart). PartialCardiki ek yöntemi daha vardır: PartialCard otherPart()ve boolean isFirstPart().
Temsilcileri
Eğer bir destem varsa, WholeCard değil, s Cardbir şekilde, s Cardbir olabileceğini PartialCardve bu anlamlı olmaz. Bu yüzden bir "fiziksel kartı" temsil eden bir nesne, yani bir WholeCardveya iki PartialCardsaniyeyi temsil edebilecek bir şey istiyorum . Geçici olarak bu tip arıyorum Representativeve Cardyöntemi olurdu getRepresentative(). A Representative, temsil ettiği kart (lar) hakkında neredeyse hiçbir doğrudan bilgi sağlamaz, sadece / kartlara işaret eder. Şimdi, benim parlak / çılgın / aptalca fikrim (siz karar verin) WholeCard'ın hem Card ve hem deRepresentative . Sonuçta, kendilerini temsil eden kartlar! WholeCards getRepresentativeolarak uygulayabilir return this;.
Gelince PartialCards, kendilerini temsil etmiyorlar, ancak bir Representativeolmayan Card, ancak iki PartialCards'ye erişmek için yöntemler sağlayan bir dışa sahipler .
Bu tür hiyerarşinin mantıklı olduğunu düşünüyorum, ancak karmaşık. Card"Kavramsal kartlar" ve Representative"fiziksel kartlar " olarak düşünürsek , çoğu kart her ikisi de! Sanırım fiziksel kartların aslında kavramsal kartlar içerdiğini ve aynı şey olmadığını iddia edebilirsiniz, ama öyle olduklarını iddia ediyorum.
Tip döküm gerekliliği
Çünkü PartialCards veWholeCards ikisi de Cards'dir ve onları ayırmak için genellikle iyi bir neden yoktur, normalde sadece birlikte çalışıyordum Collection<Card>. Bu yüzden bazen PartialCardek yöntemlerine erişebilmek için oyuncular kullanmam gerekirdi . Şu anda, burada açıklanan sistemi kullanıyorum çünkü açık seçimleri gerçekten sevmiyorum. Ve benzeri Card, Representativeya bir dönüştürülmeyecektir gerek olacağını WholeCardveya Compositefiili erişmek için, Cardtemsil ettikleri s.
Özet olarak:
- Baz tipi
Representative - Baz tipi
Card - Tür
WholeCard extends Card, Representative(erişim gerekmez, kendini temsil eder) - Tür
PartialCard extends Card(diğer bölüme erişim sağlar) - Tür
Composite extends Representative(her iki parçaya da erişim sağlar)
Bu delilik mi? Aslında çok mantıklı olduğunu düşünüyorum, ama dürüstçe emin değilim.