运算符使用不同类型重载

时间:2016-04-25 03:23:51

标签: c# operator-overloading

确定。所以我试图找出如何实现重载运算符。我已经搜索了一些教程,但有一些我不知道的东西。也许它是其中一个显而易见的'我认真思考的事情。我不知道。这就是为什么我在这里。

这是重载运算符:

public static bool operator +(Hero h, Monster m)

    {
        if (!h.IsRunningAway)
        {
            if(h.AttackSpeed > m.AttackSpeed)
            {
                m.takesDamage(h.attackValue());
                if (m.isAlive())
                {
                    h.takesDamage(m.AttackValue);
                }
            }
            else if(h.AttackSpeed < m.AttackSpeed)
            {
                h.takesDamage(m.AttackValue);
                if (h.isAlive())
                {
                    m.takesDamage(h.attackValue());
                }
            }
            else
            {
                h.takesDamage(m.AttackValue);
                m.takesDamage(h.attackValue());
            }
        }
        else
        {
            if(h.AttackSpeed <= m.AttackSpeed)
            {
                h.takesDamage(m.AttackValue);
            }              
        }
        h.IsRunningAway = false;
        return h.isAlive();
    }

现在,我尝试在表单中的按钮点击事件中实现此功能。

 private void btnAttack_Click(object sender, RoutedEventArgs e)
    {

    }

我已经看过的教程并不是特别清楚如何做到这一点。就像我说的,我可能会过度思考它。我经常这样做。

如果问题可以编辑得更清楚,或者需要其他任何内容,请告诉我。我很乐意编辑。

1 个答案:

答案 0 :(得分:1)

不要 在这里使用运算符重载!

当有意义时,应该使用运算符重载。例如,-运算符可以在DateTime上重载。当你从另一个中减去一个DateTime时,获得一个时间间隔是有意义的:

25/4/2016 - 24/4/2016 = 1 day

但在您的情况下,您希望在HeroMonster上添加bool!这毫无意义!你能告诉我这是什么意思吗?

Superman + Godzilla = True

即使你可以,也不要这样做。因为除非您需要向他们解释您的代码,否则其他人不知道。这是一场维护噩梦!

你应该做的是在Hero类中编写一个方法。

只是在阅读您的代码时,我认为您希望英雄在使用+运算符时杀死怪物。并且在战斗结束后返回英雄是否还活着。所以这种方法可能会起到作用:

///<summary>
///blah blah blah
///</summary>
///<returns>whether the hero is alive</returns>
public bool KillMonster(Monster m) {
    if (!this.IsRunningAway)
    {
        if(this.AttackSpeed > m.AttackSpeed)
        {
            m.takesDamage(this.attackValue());
            if (m.isAlive())
            {
                this.takesDamage(m.AttackValue);
            }
        }
        else if(this.AttackSpeed < m.AttackSpeed)
        {
            this.takesDamage(m.AttackValue);
            if (this.isAlive())
            {
                m.takesDamage(this.attackValue());
            }
        }
        else
        {
            this.takesDamage(m.AttackValue);
            m.takesDamage(this.attackValue());
        }
    }
    else
    {
        if(this.AttackSpeed <= m.AttackSpeed)
        {
            this.takesDamage(m.AttackValue);
        }              
    }
    this.IsRunningAway = false;
    return this.isAlive();
}

如果你想更进一步,你甚至不需要返回一个值!因为客户端代码可以调用isAlive()来检查他是否还活着,对吧?如果isAlive()是私有的,请将其公开。