我正在为我的大多数东西使用界面。我找不到一种方法来创建一个重载操作符+,它允许我对实现IPoint接口的任何对象执行添加
代码
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);
}
}
答案 0 :(得分:3)
你没有。想象一下,如果你有两个IPoint实例,a和b,两个不同的类(实现IPoint)。现在叫“a + b”。哪个运算符+被调用?返回哪种具体类型?
编辑:抱歉,澄清您的评论,“不在C#中”。关于你是否应该做到这一点,我有一些激烈的争论,因为我怀疑你可能会造成一些重大的混乱。
答案 1 :(得分:0)
我认为你不能做你所要求的事情,我已经看过去并且空洞。问题是,即使在使用.Add
的示例中,您仍然需要将movement
参数强制转换为Point Type
才能访问该方法。我相信这是C#的限制,如果我错了,我会很高兴知道它。
我建议如果您知道,总是将在Point Type
中获得MoveOf
,那么它将是安全的始终将其转换为方法内的Point
,但如果是这种情况,那么您应该接受Point
作为参数。
我唯一可以说的是,如果您最初创建Point Type
并将其传递给MoveOf
,则可以检查movement
内MoveOf
的类型在投之前。这里的问题当然是你最终必须对从IPoint
继承的所有类型执行此操作并使用MoveOf
方法。