我想扩展.NET的内置Color
结构,以添加+
或-
等新运算符。
我将使用它们:
Color c1 = Color.FromName("Red");
Color c2 = Color.FromName("Blue");
Color result = c2 - c1;
有可能吗?如果有,怎么样?
答案 0 :(得分:6)
使用内置运算符无法做到这一点。
你可以编写一种扩展方法来伪造它:
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);
答案 1 :(得分:4)
正如其他人所说,你可以采用扩展方法或Decorator模式方式。
但是,考虑到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]"
答案 2 :(得分:3)
C#中的Structs和Classes有很多相似之处,但是有几个不同之处在于你不能对struct进行子类化。您可以使用扩展方法来实现Add()或Subtract()方法,但不能在扩展方法中编写运算符重载。
如果我是你,我真的想扩展这样的现有结构的功能,我会将结构包装在我自己的类中。
答案 3 :(得分:1)
答案 4 :(得分:1)
这是一个古老的问题,但是由于它出现在我的DuckDuckGoSearch上,因此我认为应该予以回答。
您可以使用C#进行此操作。现在您可以了。也许不是9年前被问到这一点时。
有关所需的所有信息,请参阅此文档: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/operator-overloading
在结构内部,它看起来像这样:
public static Fraction operator -(Fraction a, Fraction b)
=> a + (-b);
答案 5 :(得分:0)
我会说这些已经存在,你在谈论重新定义它们吗?这些是对颜色的alpha和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
答案 6 :(得分:0)
如果无法扩展某些内容,还可以创建包装类或结构。在许多情况下,组合实际上比扩展更强大和灵活。
它允许多重继承,您可以轻松升级/包装现有对象等。
我不是说这是这个问题的最佳答案,但肯定值得考虑。 :)