Pregunta

Me gustaría hacer referencia a una propiedad en un objeto dentro de un inicializador de objeto. El problema es que la variable aún no existe, por lo que no puedo hacer referencia a la normal (objeto.method). No sé si hay una palabra clave para hacer referencia al objeto en la creación durante la inicialización del objeto.

Cuando compilo el siguiente código, obtengo el error: 'el nombre' ancho 'no existe en el contexto. entiendo por qué Entiendo este error, pero mi pregunta es: ¿hay alguna sintaxis para hacer esto?

public class Square
{
    public float Width { get; set; }
    public float Height { get; set; }
    public float Area { get { return Width * Height; } }
    public Vector2 Pos { get; set; }

    public Square() { }
    public Square(int width, int height) { Width = width; Height = height; }
}

Square mySquare = new Square(5,4)
{
    Pos = new Vector2(Width, Height) * Area
};

Me gustaría hacer referencia a las propiedades "ancho", "altura" y "área" en términos de "mysquare".

¿Fue útil?

Solución

No puedes hacer esto como está escrito, pero puedes definir el Pos propiedad para hacer lo mismo. En vez de

public Vector2 Pos { get; set; }

hacer esto

public Vector2 Pos
{
    get 
    {
        return new Vector2(Width, Height) * Area;
    }
}

Por supuesto, entonces cualquier cuadrado tiene la misma definición para Pos. No estoy seguro si eso es lo que quieres.

Editar

Según su comentario, lo tomo, desea poder especificar el valor de POS de manera deferente para diferentes cuadrados. Aquí hay otra idea. Puede agregar un tercer argumento al constructor que toma un delegado, y luego el constructor podría usar el delegado internamente para establecer la propiedad. Luego, cuando creas un nuevo cuadrado, solo pasas en una lambda para la expresión que quieres. Algo como esto:

public Square(int width, int height, Func<Square, Vector2> pos) 
{ 
    Width = width; 
    Height = height; 
    Pos = pos(this);
}

después

Square mySquare = new Square(4, 5, sq => new Vector2(sq.Width, sq.Height) * sq.Area);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top