我被困在這種情況下:是否有可能重寫與推導出的參數,而不是一個基地之一的方法?
- 我有一個叫
Ammo
抽象類,與AmmoBox
和Clip
兒童。 - 我有一個叫
Weapon
抽象類,有Firearm
和Melee
兒童。 Firearm
是抽象的,與ClipWeapon
和ShellWeapon
兒童。- 內
Firearm
,有一個void Reload(Ammo ammo);
的問題是,一個ClipWeapon
可以同時使用Clip
和AmmoBox
重裝:
public override void Reload(Ammo ammo)
{
if (ammo is Clip)
{
SwapClips(ammo as Clip);
}
else if (ammo is AmmoBox)
{
var ammoBox = ammo as AmmoBox;
// AddBullets returns how many bullets has left from its parameter
ammoBox.Set(clip.AddBullets(ammoBox.nBullets));
}
}
但ShellWeapon
,只能使用一個AmmoBox
來重裝。我可以這樣做:
public override void Reload(Ammo ammo)
{
if (ammo is AmmoBox)
{
// reload...
}
}
但是,這是不好的,因爲,即使我檢查,以確保它的AmmoBox
型的,從外面看,它看起來像一個ShellWeapon
可以採取Clip
爲好,因爲Clip
是Ammo
爲好。
或者,我可以從Firearm
刪除Reload
,並把它都ClipWeapon
和ShellWeapon
與我所需要的具體參數,可以但這樣做我會失去多態性的好處,這不是我想要的。
豈不是最佳的,如果我能覆蓋Reload
內ShellWeapon
這樣的:
public override void Reload(AmmoBox ammoBox)
{
// reload ...
}
當然,我試了一下,並沒有工作,我得到了一個錯誤說的簽名必須匹配或什麼的,但不應該這是'邏輯'有效嗎?因爲AmmoBox
是Ammo
?
我應該如何解決這個問題?一般來說,我的設計是否正確? (注意我使用的接口是IClipWeapon
和IShellWeapon
但我遇到了麻煩,所以我轉而使用類代替)
在此先感謝。
如何重新寫你寫但火器,而不是武器的一般定義是什麼? (因爲Shell和Clip武器是繼承自火器而不是武器直接)我嘗試了類似的東西,但顯然不是這樣的:public abstract class Firearm其中AmmoType:彈藥:Weapon XD –
vexe
@VeXe:你需要把':Weapon '在'AmmoType:Ammo'之前。我會更新我的答案來證明這一點。我會*強烈*建議你使用'T'前綴類型參數。 –
我認爲這是最好的,但我可以問爲什麼你說這可能不是一種有用的做事方式? – vexe