不同类型的运算符重载

Operator Overloading with different types

好的。所以我想弄清楚如何实现重载运算符。我已经搜索了一些教程,但我遗漏了一些东西。也许这是我想得太多的 'obvious' 事情之一。我不知道。这就是我来这里的原因。

这是重载运算符:

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)
    {

    }

我看过的教程都不是特别清楚如何去做。就像我说的,我可能想多了。我经常这样做。

如果可以将问题编辑得更清楚,或者需要任何其他信息,请告诉我。很高兴编辑。

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

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

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

但在你的情况下,你想对 HeroMonster 做加法,你想 return bool!那根本没有意义!你能告诉我这是什么意思吗?

Superman + Godzilla = True

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

您应该做的是在 Hero class.

中编写一个方法

仅通过阅读您的代码,我认为您在使用 + 运算符时希望英雄杀死怪物。 return 英雄是否在战斗后还活着。所以这个方法可能会完成这项工作:

///<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();
}

如果你想更进一步,你甚至不需要return一个值!因为客户端代码可以调用isAlive()来检查他是否还活着,对吧?如果 isAlive() 是私有的,则设为 public.