2009-05-27 3 views
3

저는 대부분 내 물건에 대해 인터페이스를 사용하고 있습니다. 내가 과부하 연산자를 만들 수있는 방법을 찾을 수 없습니다 + 그 날 코드두 인수가 모두 인터페이스 인 오버로드 연산자를 작성하는 방법


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); 
    } 
} 

+6

지금 C#에서이를 수행 할 방법이 없습니다. 우리는이 기능을 C# 4.0에 "확장 연산자"형태로 추가하는 것을 고려했지만, 충분히 우선 순위가 높은 기능은 아니며 잘려나갔습니다. 죄송합니다! –

+0

고마워, 내 질문에 대답 해! –

답변

3

당신은 그렇지 않은 IPoint 인터페이스

를 구현하는 모든 객체에 추가를 수행 할 수있다. 두 개의 IPoint 인스턴스 인 a와 b, 둘 다 다른 클래스 (IPoint를 구현)가 있다고 상상해보십시오. 이제 "a + b"라고 부릅니다. 어느 연산자 +가 호출됩니까? 어떤 구체적인 유형이 반환됩니까?

편집 : 죄송합니다. "Not in C# not stand"사용자 의견에 명확히하기 위해. 나는 당신이 어떤 중대한 혼란을 일으킬 수 있다고 생각하기 때문에, 당신이 이것을 할 수 있어야할지 여부에 관해서 몇 가지 철학적 논쟁을하고 있습니다.

+0

그것이 문제의 요점입니다 : 특정 클래스에 연결되지 않은 오버로드 (C++에서와 같이)를 작성하는 방법이 있습니까? 필자의 경우, IPoint 인스턴스가 2 개 호출 될 때 정의 할 연산자를 호출해야합니다. –

0

당신이 묻고있는 것을 할 수 있다고 생각하지 않습니다. 나는 과거를 들여다 보았습니다. 문제는 심지어 .Add을 사용하는 경우에도 해당 방법에 액세스하려면 에 movement 매개 변수를 계속 캐스팅해야한다는 것입니다. 이것은 내가 C#의 한계라고 믿습니다. 내가 틀렸다면 그것에 대해 매우 기뻐할 것입니다.

내가 제안하면 알고 경우이 경우는 다음이다 그러나 경우, 항상다음 항상 방법 내부 Point에 캐스팅하는 것이 안전 할 것이다 MoveOf에서 Point Type을 얻기 위하여려고하고 있다는 것입니다 매개 변수로 Point을 수락해야합니다. 내가 말할 수있는

유일한 다른 것은 당신이 처음에 Point Type을 만들고 MoveOf에 있음을 통과하는 경우, 당신이 그것을 주조하기 전에 MoveOf 내부 movement의 유형을 확인할 수 있다는 점이다. 여기서 문제는 결국 IPoint을 상속하고 MoveOf 메서드를 사용하는 모든 유형에 대해이 작업을 수행해야한다는 것입니다.