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, Card
sadece 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
}
Card
Aradığım iki alt sınıf var PartialCard
(iki parçalı kartın yarısı) ve WholeCard
(normal kart). PartialCard
iki ek yöntemi daha vardır: PartialCard otherPart()
ve boolean isFirstPart()
.
Temsilcileri
Eğer bir destem varsa, WholeCard
değil, s Card
bir şekilde, s Card
bir olabileceğini PartialCard
ve bu anlamlı olmaz. Bu yüzden bir "fiziksel kartı" temsil eden bir nesne, yani bir WholeCard
veya iki PartialCard
saniyeyi temsil edebilecek bir şey istiyorum . Geçici olarak bu tip arıyorum Representative
ve Card
yö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 getRepresentative
olarak uygulayabilir return this;
.
Gelince PartialCards
, kendilerini temsil etmiyorlar, ancak bir Representative
olmayan Card
, ancak iki PartialCard
s'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ü PartialCard
s veWholeCards
ikisi de Card
s'dir ve onları ayırmak için genellikle iyi bir neden yoktur, normalde sadece birlikte çalışıyordum Collection<Card>
. Bu yüzden bazen PartialCard
ek 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
, Representative
ya bir dönüştürülmeyecektir gerek olacağını WholeCard
veya Composite
fiili erişmek için, Card
temsil 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.