2016-04-25 13 views
0

Ok. Also versuche ich herauszufinden, wie man einen überladenen Operator implementiert. Ich habe ein paar Tutorials durchsucht, aber etwas fehlt mir. Vielleicht ist es eines dieser "offensichtlichen" Dinge, über die ich zu viel nachdenke. Ich weiß es nicht. Deshalb bin ich hier.Operator Überladung mit verschiedenen Typen

Hier ist der überladenen Operator:

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

Nun, ich versuche das Click-Ereignis in einer Schaltfläche in einem Formular zu implementieren.

private void btnAttack_Click(object sender, RoutedEventArgs e) 
    { 

    } 

Tutorials Ich habe nicht besonders klar ist, gesehen, wie man es tun. Wie ich schon sagte, überlege ich es vielleicht. Normalerweise mache ich.

Wenn die Frage bearbeitet werden kann, um klarer zu sein, oder irgendetwas anderes benötigt wird, lassen Sie es mich wissen. Ich bin froh, zu bearbeiten.

+0

Jetzt ins Bett gehen. Ich überprüfe am Morgen die Kommentare und mache dann alle Bearbeitungsanfragen von mir. –

+0

Dies ist absolut ein schrecklicher Missbrauch der Betreiberüberlastung. Dafür müssen Methoden verwendet werden. Dies führt nur zu Problemen mit der Wartbarkeit in Ihrem Code. –

Antwort

1

NICHT Verwenden Sie den Operator hier überladen!

Überlastung des Bedieners sollte verwendet werden, wenn es sinnvoll ist. Zum Beispiel kann der Operator - über DateTime überlastet werden. Wenn Sie eine DateTime von einem anderen subtrahieren, macht es Sinn, ein Zeitintervall zu erhalten:

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

Aber in Ihrem Fall möchten Sie zusätzlich auf einem Hero tun und eine Monster, und Sie eine bool zurückkehren ! Das ergibt überhaupt keinen Sinn! Kannst du mir sagen, was das bedeutet?

Superman + Godzilla = True 

Auch wenn Sie können, tun Sie es nicht. Weil andere es nicht wissen, wenn Sie ihnen nicht Ihren Code erklären müssen. Dies ist ein Wartungs-Albtraum!

Was Sie stattdessen tun sollten, ist eine Methode in der Hero Klasse schreiben.

Nur von Ihrem Code zu lesen, denke ich, dass Sie wollen, dass der Held das Monster tötet, wenn Sie den Operator + verwenden. Und kehren Sie zurück, ob der Held nach dem Kampf am Leben ist. So wird diese Methode wahrscheinlich die Arbeit machen:

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

Wenn Sie einen Schritt weiter gehen wollen, Sie brauchen nicht einmal einen Wert zurückgeben! Weil der Client-Code isAlive() aufrufen kann, um zu überprüfen, ob er lebt, nicht wahr? Wenn isAlive() privat ist, mache es öffentlich.

+0

Danke. Das ist wirklich hilfreich. Ich habe mich gefragt, warum man auch hier eine Operator Overload wollte. Aber das war nötig, also habe ich versucht, es herauszufinden. Ihre Methode macht jedoch ein wenig mehr Sinn. –