不同类型的运算符重载
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
但在你的情况下,你想对 Hero
和 Monster
、 和 做加法,你想 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.
好的。所以我想弄清楚如何实现重载运算符。我已经搜索了一些教程,但我遗漏了一些东西。也许这是我想得太多的 '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
但在你的情况下,你想对 Hero
和 Monster
、 和 做加法,你想 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.