Pregunta

decir que tengo una propiedad en una clase:

Vector3 position{get; set;}

Así que creo una instancia de esa clase en alguna parte y ahora quiero cambiar position.x, eso sería imposible ahora porque el getter y setter establecer y obtener el objeto entero. Así que tengo que hacer un Vector3 temporal cambiar sus valores y luego asignarla.

Normalmente yo haría posición de un campo público para que problema estaría resuelto. Pero no puedo hacerlo en este caso porque la posición es una implementación de una interfaz y las interfaces no pueden tener campos.

Entonces, ¿cómo puedo solucionar esto de la mejor manera.

Edit: Vector3 es un struct así que es un tipo de valor

¿Fue útil?

Solución

OMI, la respuesta más fácil aquí:

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

Ahora se puede cambiar obj.X, obj.Y y obj.Z si sólo se necesita cambiar una dimensión, o cambiar obj.Position a cambiar todo.

Si necesita el nombre position para implementar una interfaz, y luego hacerlo de forma explícita:

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

Otros consejos

es la solución directa de alguna manera no aceptable?

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

¿Qué hay de malo en eso? Parece perfectamente sencillo.

Ese es uno de los problemas con los tipos de valor mutables. Se puede crear una nueva instancia del tipo de valor con el nuevo valor X y reasignar a la propiedad. Puede hacer que la creación de la instancia más fácil proporcionando constructores útiles o añadir métodos que devuelven un objeto modificado (en lugar de modificar el valor).

.

Pre-P.S Sierra demasiado tarde que Vector3 es un tipo de valor; el siguiente post, por tanto, no será de mucha ayuda. Lo siento por ese error.

Bueno, mientras que las interfaces no pueden tener campos, puede tener propiedades, por ejemplo:.

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

En su Vector3, sólo tiene que poner en práctica esas como todo lo demás:

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

Ahora, de vuelta a su propiedad position. Se ata la propiedad a una instancia fija durante la inicialización y sólo proporciona un captador:

Vector3 position
{
    get
    {
        return _position;
    }
}

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

Al hacer que la propiedad de sólo lectura (es decir. No setter), se asegura que no va a ser reemplazado por un nuevo objeto Vector3. En cambio, la ata a una instancia fija (_position) en tiempo de inicialización. Sin embargo, se puede cambiar el Vector3 asignando nuevos valores a position.X, position.Y o position.Z.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top