我陷入了这种情况:
- 我有一个抽象类,叫做
Ammo, withAmmoBoxandClipas children。 - 我有一个抽象类,叫做
Weapon, withFirearmandMeleeas children。 Firearm是抽象的,有孩子,ClipWeapon也ShellWeapon有孩子。- 里面
Firearm,有一个void Reload(Ammo ammo);
问题是,aClipWeapon可以同时使用 aClip和 anAmmoBox来重新加载:
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));
}
}
但是 a ShellWeapon, 只能使用 anAmmoBox来重新加载。我可以这样做:
public override void Reload(Ammo ammo)
{
if (ammo is AmmoBox)
{
// reload...
}
}
但这很糟糕,因为即使我正在检查以确保它是 type AmmoBox,但从外面看,似乎 aShellWeapon也可以采用 a Clip,因为 aClip也是Ammo。
或者,我可以从 中删除Reload,Firearm并同时ClipWeapon使用ShellWeapon我需要的特定参数,但这样做我将失去多态性的好处,这不是我想要的。
如果我可以像这样覆盖Reload内部,那不是最佳选择ShellWeapon:
public override void Reload(AmmoBox ammoBox)
{
// reload ...
}
当然我试过了,但它没有用,我收到一个错误,说签名必须匹配或其他东西,但这不应该是“逻辑上”有效的吗?因为AmmoBox是一个Ammo?
我应该如何解决这个问题?总的来说,我的设计是否正确?(注意我使用的是接口IClipWeapon,IShellWeapon但遇到了麻烦,所以我转而使用类)
提前致谢。