Question

Dire que j'ai une propriété dans une classe:

Vector3 position{get; set;}

Alors je crée une instance de cette classe quelque part et maintenant je veux changer position.x, ce serait impossible maintenant parce que le getter et setter définir et obtenir l'objet entier. Donc, je dois faire un Vector3 temporaire changer ses valeurs, puis l'affecter.

Normalement, je voudrais faire place un champ public pour ce problème serait résolu. Mais je ne peux pas le faire dans ce cas parce que la position est une implémentation d'une interface et les interfaces ne peux pas avoir des champs.

Alors, comment puis-je résoudre ce la meilleure façon.

Edit: Vector3 est une structure de sorte que son un type de valeur

Était-ce utile?

La solution

OMI, la meilleure réponse ici:

private Vector3 position;
public Vector3 Position {
    get {return position;}
    set {position = value;} // with @Mehrdad's optimisation
}
public float X {
    get {return position.X;}
    set {position.X = value;}
}
public float Y {
    get {return position.Y;}
    set {position.Y = value;}
}
public float Z {
    get {return position.Z;}
    set {position.Z = value;}
}

Maintenant, vous pouvez changer obj.X, obj.Y et obj.Z si vous avez besoin de changer une dimension, ou changer obj.Position tout changer.

Si vous avez besoin du nom position pour implémenter une interface, puis le faire explicitement:

Vector3 IWhateverInterface.position {
    get {return position;}
    set {position = value;}
}

Autres conseils

La solution est simple en quelque sorte pas acceptable?

foo.position = new Vector(newX, foo.position.Y, foo.position.Z);

Quel est le problème avec ça? Il semble parfaitement simple.

C'est l'un des problèmes avec des types de valeur mutables. Vous pouvez créer une nouvelle instance du type de valeur avec la nouvelle valeur de X et réassigner pour la propriété. Vous pouvez faire la création d'instances plus facile en fournissant des constructeurs utiles ou en ajoutant des méthodes qui renvoient un objet modifié (au lieu de modifier la valeur).

.

Pré-P.S : Saw trop tard Vector3 est un type de valeur; le poste suivant donc ne sera pas d'un grand secours. Désolé pour cette erreur.

Eh bien, alors que les interfaces ne peuvent pas avoir des champs, ils peut ont des propriétés, par exemple:.

interface IVector3
{
    double X { get; set; }
    double Y { get; set; }
    double Z { get; set; }
}

Dans votre Vector3, vous implémentez simplement ceux qui, comme tout le reste:

class Vector3 : IVector3
{
    double IVector3.X
    {
        get { ... }
        set { ... } 
    }
    ...
}

Revenons maintenant à votre propriété position. Vous liez la propriété à une instance fixe pendant l'initialisation et de ne prévoir un getter:

Vector3 position
{
    get
    {
        return _position;
    }
}

private Vector3 _position = new Vector3(...);

En faisant de la propriété en lecture seule (ie. Pas setter), assurez-vous qu'il ne sera pas remplacé par un nouvel objet Vector3. Au lieu de cela, vous l'attacher à une instance fixe (_position) au moment de l'initialisation. Mais vous pouvez changer la Vector3 en affectant de nouvelles valeurs à position.X, position.Y ou position.Z.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top