我陷入了这种情况:
- 我有一个抽象类,叫做
Ammo
, withAmmoBox
andClip
as children。 - 我有一个抽象类,叫做
Weapon
, withFirearm
andMelee
as 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
但遇到了麻烦,所以我转而使用类)
提前致谢。