en (baz arayüzü dahil) Aşağıdakilerin sınıf hiyerarşisi var diyelim:C# sınıfı bir hiyerarşide Derin Kopyalama/Klonlama yöntemleri - Her yerde somut bir uygulamaya ihtiyacım var mı?
ŞimdiIAction -> (abstract) BaseAction -> (concrete) ImmediateAction -> (concrete) MovementAction
, en IAction bir yöntem sunar diyelim (kuyu, gerçekten farklı bir arayüz IAction uygular ama burada basit şeyler devam edelim gelmez!) :
// Returns a new IAction instance deep copied from the current instance.
IAction DeepClone();
Şimdiye kadar iyi mi? Bizim derin kopyalama yöntemi var ve ImmediateAction
o DeepClone()
arasında sadece bir uygulama sağlayacaktır yüzden kopyalanan istediği bazı özelliklere sahiptir, fakat aynı zamanda bir kopyası yapıcısı: Artık
//Base Action implementation
protected BaseAction(BaseAction old)
{
this.something = old.something;
}
//Immediate Action Implementation
protected ImmediateAction(ImmediateAction old)
: base(old)
{
this.anything = old.anything;
}
public IAction DeepClone()
{
return new ImmediateAction(this);
}
, en MovementAction
yok diyelim İçerisinde DeepClone()
ile ilgili olan hiçbir şey yoktur, bu nedenle yöntemi veya kopya kurucuyu uygulamamaktadır. Yeni ImmediateAction
örneklemek, bu yüzden ImmediateAction.DeepClone()
yerine denir, MovementAction
DeepClone()
uygulamıyor - Burada neler olduğunu anlamak Şimdi
IAction x = new MovementAction();
IAction y = x.DeepClone();
//pleaseBeTrue is false
bool pleaseBeTrue = y is MovementAction;
: yaşıyorum
sorun budur. Bu nedenle, yukarıdaki örnekte y
türü MovementAction
yerine ImmediateAction
şeklindedir.
Bu uzun girişten sonra sorum şu: Bu tür bir durum için en iyi uygulama nedir? Sıkışmış mıyım 'un yönteminiyöntemini uygulamak için hiyerarşisi boyunca her sınıf için ne olursa olsun? Burada yanlış kullandığım desen var ve daha iyi bir yolu var mı?
Son bir not: Eğer mümkün olursa yansıma yapmaktan kaçınmak istiyorum.
Neden yansımayı önlemek istersiniz? –
Bu bir oyunda, ve potansiyel olarak oyun sırasında değil, sadece yükleme sırasında kullanılıyor, bu yüzden eğer mümkün olursa yansıma tepesinden kaçınmak istiyorum. Biraz arka plan: Genellikle, JSON/XML tanımları aracılığıyla şeyler yüklenir, ancak IAction fabrikası (ve diğer fabrikalar) önbellekleri türüne göre önbellekler ve yeniden yükleme için XML'e geri gitmekten kaçınmak için saklanan referansı klonlar.(Havuzlama başka bir seçenekdi, ancak birçok farklı türdeki eylemlerle, hepsi farklı özelliklere sahipti ve bu yüzden yüzlerce farklı havuz olmaksızın bir havuzlama çözümünü göremiyorum) – Terminal8
Bana bir niyet meselesi gibi görünüyor. Bir şeyi 'IAction' olarak ele almayı planlıyorsanız ve 'DeepClone' olarak adlandırdığınız nesnelerin orijinal türünü korumak önemlidir, 'DeepClone'u,' IAction'ı uygulayan tüm bu somut sınıflara yazarsınız. 've bu, yaratılan doğru nesneyi elde etmenizi sağlayacaktır. Neyse ki, bunları yazmak önemsiz. – itsmatt