Autor Beitrag
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Fr 24.10.14 09:09 
Hey Leute,

bei C# wird beim Überladen von Operatoren ja auf die Parameterreihenflolge geachtet, also z.B.
ausblenden 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:
ausblenden 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)
{
   ...
}

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 24.10.14 10: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)

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

Für diesen Beitrag haben gedankt: C#
C# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Fr 24.10.14 12:16 
Ja das wäre jetzt auch mein Ansatz gewesen. Einfach bei dem einen Operator die Operanten tauschen.
ausblenden 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:
ausblenden C#-Quelltext
1:
2:
3:
4:
public static Vector commutative operator * (Vector a, float b)
{
   ...
}

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler