Entwickler-Ecke

Basistechnologien - Operator überschreiben


FelixD - Fr 14.01.11 16:07
Titel: Operator überschreiben
Hallo, ich möchte in einer Klasse modint, welche das Rechnen modulo einer Primzahl p wiedergeben soll, den % überschreiben. Der Grund ist, dass dieser auch negative Werte zurück geben kann (z.b. -3 % 2 = -1 statt -3 % 2 = 1).
Nun stehe ich vor folgender Frage: Ich möchte im Body des neuen % Operators den ursprünglichen % Operator verwenden. Ist das möglich und wenn ja wie?

lg Felix

Edit:

Eigentlich weiß ich nicht mal ob man einen Operator lokal überschreiben kann und wie das geht ?


Th69 - Fr 14.01.11 16:18

s. Operator (C# Referenz) [http://msdn.microsoft.com/de-de/library/s53ehcz3.aspx], nur daß du "Fraction" durch deine eigene Klasse "ModInt" (Klassennamen bitte immer mit Großbuchstabe am Anfang!) ersetzen mußt und dann eben '%' als Operator überlädst.
Intern kannst du dann bei zwei Int-Werten selbstverständlich darauf dann den eingebauten % Operator anwenden.


FelixD - Fr 14.01.11 16:28

Ja ich hab den Klassennamen schon bevor du mir geantwortet hast umgeschrieben, weil mir diese Konvention eingefallen ist ;)

Was in diesem Artikel gezeigt wird kenne ich schon. Ich will keinen Operator für zwei ModInts schreiben, sondern wircklich lokal den vorimplementierten Modulo-Operator für ints überschreiben, wobei ich eben zum implementieren des neuen Operators auf den Alten Operator zurückgreifen will. So z.b.:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
static ModInt operator % (int n, int p)
    {
      n=n%p;
      if(n<0)
      { n= p+n; }
      return n;
    }


Also sinngemäß so, den in der vorliegenden Form wird es wahrscheinlich eine Endlosschleife. Oder funktioniert überhaupt nicht ...


Th69 - Fr 14.01.11 16:34

Sorry, aber das geht nicht. Die vordefinierten Operatoren für die Standardtypen können nicht überladen werden.
Das einzige, was du machen kannst, ist zusätzlich einen expliziten bzw. impliziten Konvertierungsoperator für int nach ModInt anzubieten, s. explicit (C# Referenz) [http://msdn.microsoft.com/de-de/library/xhbhezf4.aspx] sowie implicit (C# Referenz) [http://msdn.microsoft.com/de-de/library/z5z9kes2.aspx].


FelixD - Fr 14.01.11 16:44

Aso, naja ist auch nicht allzu tragisch, wäre nur irgendwie schön gewesen ...

Danke für die Hilfe!


Yogu - Fr 14.01.11 22:33

user profile iconFelixD hat folgendes geschrieben Zum zitierten Posting springen:
wäre nur irgendwie schön gewesen ...

Meinst du wirklich? Wenn jemand dann deine Bibliothek einbindet, ändert sich plötzlich das Verhalten eines Systemoperators - glaubst du nicht, dass das für maßlose Verwirrung sorgen würde? Das ist es ja gerade, was C# ausmacht: Dass (möglichst) nichts unerwartetes passiert.