我的基类中有一个虚拟方法,该方法在继承的类中被覆盖。
我希望能够从基本虚拟方法中退出基本虚拟方法和覆盖方法。
使用bool来实现此目的在程序上并不正确。作为笨蛋,我认为主要是用来检查某些东西的。
public virtual bool IsHit(int damage, Vector3 hitDirection){
if (IsDead) return false;
aiHealth -=damage;
if (aiHealth <= 0) {
Death();
return false;
}
return true;
}
public override bool IsHit(int damage, Vector3 hitDirection){
if (!base.IsHit(damage, hitDirection)) return false;
//Do stuff when enemy is hit.
return true;
}
另一种让我疲惫不堪的方法是
public virtual void IsHit(int damage, Vector3 hitDirection){
if (IsDead) return;
aiHealth -=damage;
if (aiHealth <= 0) {
Death();
return false;
}
}
public override void IsHit(int damage, Vector3 hitDirection){
base.IsHit(damage, hitDirection);
if (IsDead) return;
//Do stuff.
}
但是随后我必须两次致电“ IsDead”检查。
理想情况下,我希望将此方法作为void并在虚拟void调用返回中包含一些代码,并停止在override方法中运行的代码。
或者知道哪种方法最“正确”。
答案 0 :(得分:1)
有多种方法可以给猫咪剥皮,最好的方法取决于很多因素。
您总是可以引发异常以退出方法并使异常气泡上升到适当的位置。但是您应该只针对错误情况执行此操作,而在这里似乎并非如此。
我认为,您的第二种方法可能很好,并且检查bool标志(IsDead
)通常不会对性能产生明显影响。阅读代码时也很容易理解。
如果您需要另一种无需检查覆盖方法的方法,则可以像这样在基类中拆分该方法
public void IsHit(int damage, Vector3 hitDirection){
if (IsDead) return;
aiHealth -=damage;
if (aiHealth <= 0) {
Death();
return false;
}
IsHitWhenNotDead(damage, hitDirection);
}
protected virtual void IsHitWhenNotDead(int damage, Vector3 hitDirection){
}
在派生类中:
protected override void IsHitWhenNotDead(int damage, Vector3 hitDirection){
// Do stuff
}
请注意,原来的IsHit
不再是virtual
并且不能被覆盖。相反,您可以覆盖空的IsHitWhenNotDead
方法,该方法仅在适当时调用
答案 1 :(得分:0)
将函数的逻辑拆分为可以覆盖的单独的受保护虚拟方法
基类
public void IsHit(int damage, Vector3 hitDirection){
OnIsHit(damage, hitDirection);
}
protected virtual bool OnIsHit(int damage, Vector3 hitDirection)
if (IsDead) return false;
aiHealth -=damage;
if (aiHealth <= 0) {
Death();
return false;
}
return true;
}
派生类
public override bool OnIsHit(int damage, Vector3 hitDirection){
if (!base.IsHit(damage, hitDirection)) return false;
//Do stuff when enemy is hit.
return true;
}
现在,您的主函数IsHit
返回所需的空值,但内部实现返回bool
以便在需要尽早退出代码的情况下通知子代。