Entwickler-Ecke
Basistechnologien - Operatoren überladen shorcut für (a, b) -> (b, a)
C# - Fr 24.10.14 08:09
Titel: Operatoren überladen shorcut für (a, b) -> (b, a)
Hey Leute,
bei C# wird beim Überladen von Operatoren ja auf die Parameterreihenflolge geachtet, also z.B.
C#-Quelltext
1: 2: 3: 4:
| Point p = new Point(2, 3); p = 2 * p; p = p * 2; |
Mal abgesehen davon, dass das obige Beispiel eigentlich nicht funktioniert: Gibt es einen Trick damit ich nicht nochmal die ganzen Operatoren überladen muss, nur mit vertauschten Parametern?
Also dass ich nicht das hier machen muss:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| public static Vector operator * (float a, Vector b) { ... }
public static Vector operator * (Vector a, float b) { ... } |
Ralf Jansen - Fr 24.10.14 09:44
Ich glaube nicht. Ist auch ein Spezialfall für kommutative Operatoren und auch nur dann sinnvoll wenn einer der beiden beteiligten Parameter eindeutig ~höherwertig~ (mir fällt leider kein besseres Wort dafür ein) ist. Im Normalfall würde ich auch immer davon ausgehen das bei solch einer Operation immer der linke Typ rauskommt. Also bei Type A * Type B sollte ein Type A rauskommen. Bei Type B * Type A aber ein Type B.
Ich würde der Vektor Klasse erst mal eine normale Oberfläche geben und die dann für die Operatorenüberladung wiederverwenden (macht das Framework so, z.B in Point, Decimal)
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| public static Vector Multiply(Vector v, float f) { ... }
public static Vector operator * (float a, Vector b) { return Multiply(b,a); }
public static Vector operator * (Vector a, float b) { return Multiply(a,b); } |
C# - Fr 24.10.14 11:16
Ja das wäre jetzt auch mein Ansatz gewesen. Einfach bei dem einen Operator die Operanten tauschen.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| public static Vector operator * (float a, Vector b) { ... }
public static Vector operator * (Vector a, float b) { return b * a; } |
Nachtrag
Man könnte ein neues Schlüsselwort einführen "commutative" :mrgreen: und dann:
C#-Quelltext
1: 2: 3: 4:
| public static Vector commutative operator * (Vector a, float b) { ... } |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!