Wie addieren oder subtrahieren von zwei Instanzen der gleichen Klasse/Typ
Habe ich ein Typ, der für eine Art von Zahl. In diesem Fall arbeite ich mit Megawatt, so habe ich einen Typ namens Megawatt. Ich möchte in der Lage sein, um mit diesen Megawatt würde ich einen Int, Double, oder jede Art von c# - Nummer geben. Ist das möglich? Wenn ja, wie mache ich es?
Beispiel:
public class Megawatt{
public double Value { get; set; }
}
Ich möchte in der Lage sein, dies zu tun:
var startOfDay = new Megawatts{value=100};
var endOfDay = new Megawatts{value=65};
Megawatt result = startOfDay - endOfDay;
Dies ist möglich mit DateTime... können Sie subtrahieren eines DateTime-von anderen und erhalten Sie eine Zeitspanne. Ich bin der Hoffnung, etwas ähnliches zu tun.
- Siehe auch stackoverflow.com/questions/348853/...
- Sie sollten use-Operator Überladen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zusätzlich zu den guten Antworten bisher: Sie sollten Ihre Art eine unveränderliche Struktur, sondern als eine veränderliche Wert Typ. Dies ist genau die Art von job, der unveränderliche Wert-Typen konzipiert wurden.
Und so weiter. Beachten Sie, dass Sie hinzufügen können zusammen zwei Megawatt, aber Sie können nicht multiplizieren von zwei Megawatt; Sie können nur multiplizieren Megawatt durch verdoppelt.
Könnte man auch hinzufügen, mehr Einheit-laden-Typen. Zum Beispiel könnten Sie eine Art MegawattHour und geben Sie Stunde und dann sagen, dass die Megawatt-Stunde mal gibt MegawattHour. Man könnte auch sagen, dass es eine andere Art Joule, und es ist eine implizite Konvertierung von MegawattHour zu Joule.
Gibt es eine Reihe von Programmiersprachen, die diese Arten von Operationen mit weniger Ausführlichkeit, als C#, wenn Sie tun eine Menge von dieser Art von Sache, die Sie Aussehen könnte, in F#.
sollten Sie schreiben Sie Ihre eigenen operator überladen :
Beispiel :
Dies nennt man operator-überladen. Ich schlage vor, Sie Lesen Sie diesen Artikel:
http://msdn.microsoft.com/en-us/library/aa288467(v=vs. 71).aspx
Es ist ein tutorial über den Prozess. Im Grunde Sie ändern die Bedeutung des
-
Betreiber für diese Arten.Als ein Beispiel (geklaut aus dem link)
Und auf diese Weise Ihre minus-Zeichen können nun subtrahieren Megawatt
Dazu können Sie für jede Art oder Kombination von Typen. Sie können sogar wieder noch eine Dritte Art, wenn Sie wollte. Viele Sprachen unterstützen dieses Konzept und seine sehr nützlich.
Erweiterte Antwort:
Operator überladung ist der Weg zu gehen in diesem Fall sicher. Überladen von Operatoren ist eine tolle Möglichkeit, in C# ermöglicht die Bequemlichkeit der Operatoren anstelle von Methoden in einer Klasse.
Beim überladen eines operators wie
+
die entsprechenden zusammengesetzten Zuweisungsoperator ist auch überlastet z.B.+=
Wie Sie es sich vorstellen mit Ihrem Einsatz, operatorüberladungen müssen
static
und verwenden Sie das keyword -operator
wie in @RoyiNamir Antwort.Einfach zu erweitern auf die Antwort der folgenden binären Vergleichsoperatoren, zusätzlich zu den mathematischen Operatoren können überladen werden, in der Paare nur:
==
und!=
>
und<
>=
und<=
Soweit code-design Empfehlung, genau wie @RoyiNamir sagte, die operator-überladungen existieren sollten, im inneren der Klasse, dass Sie eine überlastung der Betreiber.
Erstellen eigener Typen ist eine gute Idee; es verhindert, dass Mars lander Probleme, wo Sie hinzufügen Kilogramm und Pfund. Jedoch, ich schlage vor, machen Sie
struct
s, nicht Klassen, wie, dass Sie unveränderlich und entfernen Sie das Potenzial der Initialisierung mit null-Werten. Auch, stellen Sievalue
privaten, also können Sie Sachen wie tun:Sollten Sie auch prüfen, die Durchführung
IComparable<>
,IEquatable<>
-, Konvertierungs-Operatoren und so weiter. Dies wird Ihnen ermöglichen, führen Sie Vergleiche an, und erstellen Sie Kollektionen vonMegawatt
s.Machen diese eine Menge Arbeit; Fragen Sie C# Kanonische Formen.