Расширить существующую структуру в C #, чтобы добавить операторы - PullRequest
6 голосов
/ 17 августа 2011

Я хочу расширить встроенную структуру .NET Color для добавления новых операторов, таких как + или -.
Я буду использовать их как:

Color c1 = Color.FromName("Red");
Color c2 = Color.FromName("Blue");
Color result = c2 - c1;

Возможно ли это? если да, то как?

Ответы [ 6 ]

7 голосов
/ 17 августа 2011

Нет способа сделать это с помощью встроенных операторов.

Вы могли бы написать метод расширения, чтобы подделать его, хотя:

public static class Extensions
{
    public static Color Substract(this Color color, Color theOtherColor)
    {
        //perform magic here! 
        //be sure to return something or this won't compile
    }
}

Color c1 = Color.FromName("Red");
Color c2 = Color.FromName("Blue");
Color result = c2.Subtract(c1);
4 голосов
/ 17 августа 2011

Как и предполагали другие, вы можете использовать либо методы расширения, либо шаблон Decorator.

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

public class MyColor {
    public System.Drawing.Color val;

    public MyColor(System.Drawing.Color color)
    {
        this.val = color;
    }

    public static MyColor AliceBlue 
    {
        get {
            return new MyColor(System.Drawing.Color.AliceBlue);
        }
    }

    public override string ToString()
    {
        return val.ToString();
    }
    // .... and so on....

    // User-defined conversion from MyColor to Color
    public static implicit operator System.Drawing.Color(MyColor c)
    {
        return c.val;
    }
    //  User-defined conversion from Color to MyColor
    public static implicit operator MyColor(System.Drawing.Color c)
    {
        return new MyColor(c);
    }
}

для проверки:

MyColor c = System.Drawing.Color.AliceBlue; // assigning a Color to a MyColor
                                            // thanks to the implicit conversion
Console.WriteLine(c.ToString()); // writes "Color [AliceBlue]"
3 голосов
/ 17 августа 2011

Структуры и классы в C # имеют много общего, однако одно из нескольких отличий состоит в том, что вы не можете создать подкласс структуры.Вы можете использовать метод расширения для реализации метода Add () или Subtract (), но вы не можете написать перегрузку оператора в методе расширения.

Если бы я был вами, я действительно хотел бы расширить функциональностьсуществующую структуру, как это, я бы обернул структуру в моем собственном классе.

1 голос
/ 17 августа 2011

Посмотрите на extension methods.

0 голосов
/ 23 января 2017

Если вы не можете расширить что-то, вы также можете создать класс-оболочку или структуру.Во многих случаях композиция на самом деле более мощная и гибкая, чем расширение.

Это допускает множественное наследование, вы можете легко обновить / обернуть существующий объект и т. Д.

Я не говорю, что это лучший ответ на этот вопрос, но, безусловно, кое-что стоит рассмотреть.:)

0 голосов
/ 17 августа 2011

Я бы сказал, что они уже существуют, вы говорите о переопределении их?Это операции над альфа и RGB цветами.См. Ниже:

http://msdn.microsoft.com/en-us/library/system.windows.media.color.op_subtraction.aspx

http://msdn.microsoft.com/en-us/library/system.windows.media.color.op_addition.aspx

...