C# 如何在两个参数都是接口的情况下编写重载运算符
我的大部分东西都使用界面。我找不到一种方法来创建一个重载操作符+,它允许我对实现IPoint接口的任何对象执行加法 代码C# 如何在两个参数都是接口的情况下编写重载运算符,c#,interface,operators,operator-overloading,C#,Interface,Operators,Operator Overloading,我的大部分东西都使用界面。我找不到一种方法来创建一个重载操作符+,它允许我对实现IPoint接口的任何对象执行加法 代码 你没有。想象一下,如果有两个IPoint实例a和b,它们都是不同的类(实现IPoint)。现在叫“a+b”。哪个操作员+被呼叫?返回哪种混凝土类型 编辑:抱歉,请澄清您的评论,“不是目前的C语言”。我有一些关于你是否能做到这一点的菲利普斯式的争论,因为我怀疑你会制造一些重大的混乱 我认为你不能按你的要求去做,我已经回顾了过去,结果是空的。问题是,即使在使用的示例中,添加仍然需
你没有。想象一下,如果有两个IPoint实例a和b,它们都是不同的类(实现IPoint)。现在叫“a+b”。哪个操作员+被呼叫?返回哪种混凝土类型
编辑:抱歉,请澄清您的评论,“不是目前的C语言”。我有一些关于你是否能做到这一点的菲利普斯式的争论,因为我怀疑你会制造一些重大的混乱 我认为你不能按你的要求去做,我已经回顾了过去,结果是空的。问题是,即使在使用
的示例中,添加
仍然需要将移动
参数强制转换为点类型
,才能访问该方法。我认为这是C#的一个限制,如果我错了,我很乐意知道
我的建议是,如果你知道你总是会在MoveOf
中得到一个点类型
,那么总是将它投射到方法内部的点
是安全的,但是如果是这种情况,那么你应该接受点
作为参数
我唯一能说的另一件事是,如果您最初创建一个
点类型
,并将其传递给MoveOf
,您可以在铸造它之前检查MoveOf
内部的移动类型。当然,这里的问题是,您最终必须对继承自IPoint
的所有类型执行此操作,并使用MoveOf
方法。目前在C中无法执行此操作。我们考虑以“扩展操作符”的形式将此功能添加到C#4.0中,但它的优先级不够高,因此被删除。很抱歉谢谢,这回答了我的问题!这就是问题的关键:有没有一种方法可以编写一个未附加到特定类的重载(如在C++中)。在我的例子中,我希望在调用IPoint的2个实例时调用我定义的操作符。
interface IPoint
{
double X { get; set; }
double Y { get; set; }
}
class Point : IPoint
{
double X { get; set; }
double Y { get; set; }
//How and where do I create this operator/extension ???
public static IPoint operator + (IPoint a,IPoint b)
{
return Add(a,b);
}
public static IPoint Add(IPoint a,IPoint b)
{
return new Point { X = a.X + b.X, Y = a.Y + b.Y };
}
}
//Dumb use case :
public class Test
{
IPoint _currentLocation;
public Test(IPoint initialLocation)
{
_currentLocation = intialLocation
}
public MoveOf(IPoint movement)
{
_currentLocation = _currentLocation + intialLocation;
//Much cleaner/user-friendly than _currentLocation = Point.Add(_currentLocation,intialLocation);
}
}