Как я могу использовать синтаксис инициализатора массива для пользовательского векторного класса? - PullRequest
2 голосов
/ 11 июля 2010

У меня есть класс примерно , сконструированный так:

class Vector3
{
    float X;
    float Y;
    float Z;

    public Vector3(float x, float y, float z)
    {
        this.X = x;
        this.Y = y;
        this.Z = z;
    }
}

У меня есть другие классы, реализующие его как свойства, например:

class Entity
{
    Vector3 Position { get; set; }
}

Теперь, чтобы установить позицию объекта, я использую следующее:

myEntity.Position = new Vector3(6, 0, 9);

Я хотел бы сократить это для пользователя, внедрив массивоподобный инициализатор для Vector3:

myEntity.Position = { 6, 0, 9 };

Однако ни один класс не может наследовать массивы. Более того, я знаю, что смог бы каким-то образом добиться этого с небольшими взломами:

myEntity.Position = new[] { 6, 0, 9 };

Но дело не в этом. :)

Спасибо!

Ответы [ 3 ]

2 голосов
/ 11 июля 2010

Не существует определенного синтаксиса для использования синтаксиса инициализатора массива, за исключением массивов. Однако, как вы намекаете, вы можете добавить оператор (или два) к вашему типу:

    public static implicit operator Vector3(int[] value)
    {
        if (value == null) return null;
        if (value.Length == 3) return new Vector3(value[0], value[1], value[2]);
        throw new System.ArgumentException("value");
    }
    public static implicit operator Vector3(float[] value)
    {
        if (value == null) return null;
        if (value.Length == 3) return new Vector3(value[0], value[1], value[2]);
        throw new System.ArgumentException("value");
    }

Тогда вы можете использовать:

obj.Position = new[] {1,2,3};

и т.д.. Тем не менее, лично я бы просто оставил это, как:

obj.Position = new Vector3(1,2,3);

, что требует меньше работы (без выделения / инициализации массива, без вызова оператора).

1 голос
/ 11 июля 2010

Весь смысл запроса - уменьшить общий объем кода.Это просто удобнее сделать {1, 2, 3}.Кажется странным, что C # не позволяет вам перегрузить операторы, чтобы сделать это, или разрешить другой способ использовать инициализаторы массива для пользовательских ссылочных типов.

0 голосов
/ 11 июля 2010

Есть 2 варианта:

1) Использовать синтаксис инициализации объекта:

myEntity.Position = new Vector3(){ X = 6, Y = 0, Z = 9 };

2) Создайте consttructor, который принимает массив:

Vector3( float[] array )
{
  // Validate, set X = array[0] etc.
}

myEntity.Position = new Vector3( new float[3]{ 6, 0, 9} );

Я не уверен, что любой из них проще, чем просто

myEntity.Position = new Vector3( 6, 0, 9 );

Который у вас уже есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...