2014-04-14 2 views
0

나는 이런 구조체를 가지고있다. Money를 들어C#을 사용하면 한 번에 모든 연산자를 어떻게 오버로드 할 수 있습니까?

public struct Money 
{ 
    private readonly decimal _quantity; 

    private Money(decimal qty) 
    { 
     _quantity = Math.Round(qty, 2); 
    } 

    public static implicit operator Money(decimal dec) 
    { 
     return new Money(dec); 
    } 
} 

, 나는 모든 사업자 +를 오버로드해야합니까 - <, < =,>,> =, ==, = 등!? 아니면 Money에 대해서도 decimal의 모든 연산자를 수락 할 수있는 방법이 있습니까? 보시다시피 Money에는 _quantity이라는 필드가 하나만 있습니다. 나는 모든 사업자가 Money에 대해 요청한 경우 _quantity를 요청하는 것처럼 되돌려 주길 원합니다.

암시 적 변환 연산자보다 과부하가 문제를 해결할 수도 있습니다. 내 전체 프로젝트에 decimal를 사용하지 않기 때문에

public static implicit operator decimal(Money money) 
{ 
    return money._quantity; 
} 

나는, Money 구조체를 만드는 오전. 컴파일러는 decimal 대신 Money을 사용해야합니다. 위의 변환 연산자를 암시 적으로 사용하면이 구조체를 만드는 이유와 모순됩니다. 당신은에있는

답변

1

사전에 덕분에 ... 모든 운영자 별도로을 구현,하지만 당신은 하지 <=> 연산자를 에뮬레이트하기 위해 (static Compare 방법을 inmplementing하여 프로세스 을 단순화 할 수 있습니다 by C#) :

public struct Money: IComparble<Money> { 
    private readonly decimal _quantity; 

    ... 

    // C# doesn't have <=> operator, alas... 
    public static int Compare(Money left, Money right) { 
    if (left._quantity < right._quantity) 
     return -1; 
    else if (left._quantity > right._quantity) 
     return 1; 
    else 
     return 0; 
    } 

    public static Boolean operator == (Money left, Money right) { 
    return Compare(left, right) == 0; 
    } 

    public static Boolean operator != (Money left, Money right) { 
    return Compare(left, right) != 0; 
    } 

    public static Boolean operator > (Money left, Money right) { 
    return Compare(left, right) > 0; 
    } 

    public static Boolean operator < (Money left, Money right) { 
    return Compare(left, right) < 0; 
    } 

    public static Boolean operator >= (Money left, Money right) { 
    return Compare(left, right) >= 0; 
    } 

    public static Boolean operator <= (Money left, Money right) { 
    return Compare(left, right) <= 0; 
    } 

    public int CompareTo(Money other) { 
    return Compare(this, other); 
    } 
} 
+0

답장을 보내 주셔서 감사합니다. Dmitry. 하지만 연산자 오버로드 메서드는 이미'return left._quantity right._quantity' 구조를 가지고 있습니다. C#에서 제네릭 형식뿐만 아니라 제네릭 연산자도 지원했다면 제 질문에 답이있을 것입니다. – serdar

+0

@serdar : 예, "<=>"연산자 (모든 비교를 결합 할 수 있음)와 숫자 유형 (산술을 구현하는 경우)이 때때로 성가시다. –

관련 문제