2010-11-20 5 views
2

J'essaie de créer une classe appelée LoopingInt. Il stocke deux entiers, l'un étant la valeur maximale de l'entier et l'autre étant un entier stocké. Lorsque l'entier tombe en dessous de 0 ou au-dessus de la valeur maximale, il «rebondit». Donc, si vous ajoutez 3 à un LoopingInt avec une valeur de 4, et la valeur maximale est 6, l'entier stocké en interne dans la classe sera 7, mais demander l'entier extérieur retournera 0.Aide sur la surcharge de l'opérateur implicite en C#

Ce que je veux faire est de faire en sorte que je puisse travailler avec LoopingInts comme s'ils étaient des entiers. Je peux déjà affecter LoopingInts à des objets int (int x = myLoopingInt), mais je ne peux pas assigner un int à un LoopingInt parce que je n'arrive pas à comprendre comment renvoyer un objet LoopingInt avec la bonne valeur maximale. J'ai besoin de la valeur maximale de la valeur de gauche, mais je ne sais pas comment l'obtenir.

+1

Je nommer 'WraparoundInt' ou quelque chose de similaire, comme la notion de débordement d'entier provoquant la valeur à enveloppants est familière à beaucoup de programmeurs. – Oded

+0

FYI ce que vous construisez est un système arithmétique modulaire sur une classe de congruence d'entiers; ainsi vous formez un * anneau commutatif *. Voir http://en.wikipedia.org/wiki/Modular_arithmetic pour quelques informations mathématiques qui pourraient vous être utiles. –

+0

Cela semble être une bonne idée. Je ferai ça. – Timballisto

Répondre

2

Si vous vous demandez comment résoudre:

LoopingInt myLoopingInt = new LoopingInt(4, 10); 
myLoopingInt = x; 

afin que membre de myLoopingInt Value est modifié mais le membre MaxValue reste le même alors je ne pense pas que son possible. Vous pouvez définir une propriété à la place:

myLoopingInt.Value = x; 
+0

Pour l'instant je pense que je vais devoir accepter ce fait, aussi irritant que cela puisse être. – Timballisto

0

Eh bien, vous devez décider de la sémantique que vous voulez:

class LoopingInt32 { 
    // details elided 

    public LoopingInt32(int maximumValue, int value) { // details elided } 

    public static implicit operator LoopingInt32(int x) { 
     int maximumValue = some function of x; <-- you implement this 
     int value = some other function of x; <-- you implement this 
     return new LoopingInt32(maximumValue, value); 
    } 
} 

Nous ne pouvons pas décider pour vous. Edit: Ce que vous demandez est complètement impossible Le côté droit d'une affectation ne connaît jamais le côté gauche. Il ne peut même pas être un côté gauche (considérez SomeFunctionThatEatsLoopingInt32(5))!

+0

Désolé, aurait dû être plus clair sur ma question. La propriété maximumValue est indépendante de la valeur de x. Il est stocké dans la valeur de gauche mais je ne sais pas comment l'obtenir. valeur je sais déjà comment obtenir - c'est tout simplement x. – Timballisto

+0

@Timballisto: Oh. Alors ce que vous demandez est complètement impossible. Le membre de droite d'une affectation ne connaît jamais le côté gauche. – jason

0

Vous pouvez écrire un opérateur de conversion implicite:

public static implicit operator LoopingInt(int i) 
{ 
    return new LoopingInt(i); 
} 
+0

Eh bien, mon idée est déjà d'utiliser un opérateur implicite, cependant, ce que je dois faire est quelque chose comme ceci: myLoopingInt = 5 Avec la valeur maximale de myLoopingInt restant le même. Pour ce faire, je dois obtenir cette valeur à partir de la valeur de gauche, et je ne sais pas comment. – Timballisto