Почему я не могу перегрузить оператор * для умножения прямоугольников с 2D векторами? - PullRequest
3 голосов
/ 29 июня 2011

Я пытался перегрузить оператор умножения для удобства масштабирования двумерных спрайтов, но, похоже, один из операндов должен иметь содержащий тип.Это жаль, потому что я не считаю свое решение нелогичным.Кроме того, я обнаружил, что такие перегрузки операторов должны быть объявлены в объявлении класса одного из операндов.Итак, я должен создать свой собственный класс SuperRectangle или есть какие-то обходные пути?

public static Rectangle operator * (Rectangle rect, Vector2 scale)
{
    return new Rectangle(rect.X, rect.Y, (int)(rect.Width * scale.X), (int)(rect.Height * scale.Y));
}

1 Ответ

5 голосов
/ 29 июня 2011

Вы можете перегрузить *, если один или несколько типов определены пользователем, а определение перегрузки содержится в одном из задействованных типов. Если задействованные типы являются встроенными и / или вы не контролируете исходный код, вы не сможете определить собственную перегрузку. (См. Разделы 7.3 и 7.3.2 спецификации языка C # )

Вообще говоря, вы можете преобразовать свою логику в методы расширения на Rectangle и / или Vector2 и все же достичь своей общей цели.

public static class RectangleExtensions 
{
    public static Rectangle MultiplyBy(this Rectangle rect, Vector2 scale)
    {
        return new Rectangle(//...
    }

    public static Rectangle MultiplyBy(this Vector2 scale, Rectangle rect) 
    {
        return new Rectangle(//...
    }
}

// using it
Rectangle output = yourRect.MultiplyBy(yourVector);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...