从基本方法的重写方法返回。统一

时间:2019-06-20 07:56:46

标签: c# visual-studio unity3d

我的基类中有一个虚拟方法,该方法在继承的类中被覆盖。

我希望能够从基本虚拟方法中退出基本虚拟方法和覆盖方法。

使用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方法中运行的代码。

或者知道哪种方法最“正确”。

2 个答案:

答案 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以便在需要尽早退出代码的情况下通知子代。