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(23);
p = 2 * p;
// ist nicht die gleiche Operation wie
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)
{
   ...
}