적절한 연산자 오버로딩의 명백한 예는 숫자가 작동하는 것과 같은 방식으로 작동하는 클래스입니다. 따라서 Jalayn이 제안한 BigInt 클래스 , 복소수 또는 행렬 클래스 ( Superbest가 제안한)는 모두 일반 숫자가 수학 연산자에 실제로 매핑하는 것과 동일한 연산을 갖지만 시간 연산 ( svick이 제안한 대로 )은 서브 세트에 훌륭하게 매핑됩니다. 그 작업 중.
약간 더 추상적으로, 연산자는 set like 연산을 수행 할 때 사용될 operator+
수 있으므로 union , 보완 등이 operator-
될 수 있습니다 . 이것은 특히 더하기 또는 곱하기 연산자를 사용하는 경우 패러다임을 확장하기 시작합니다. 예상대로 t commutative .
C # 자체에는 숫자 가 아닌 연산자 오버로드 의 훌륭한 예가 있습니다. 델리게이트 를 사용 +=
하여 델리게이트-=
를 추가 및 제거 합니다. 즉, 델리게이트 를 등록 및 등록 해제합니다. 이것은 +=
and -=
연산자가 예상대로 작동 하기 때문에 잘 작동하므로 훨씬 간결한 코드가 생성됩니다.
순수 주의자에게는 문자열 +
연산자 의 문제점 중 하나는 정식 이 아니라는 것입니다. "a"+"b"
와 동일하지 않습니다 "b"+"a"
. 이 예외 는 문자열에 대한 일반적인 예외 이기 때문에 이해 하지만 operator+
다른 유형에 사용 하는 것이 정식 적인지 아닌지 어떻게 알 수 있습니까? 대부분의 사람들은 객체가 문자열과 같지 않다고 가정 하지만 사람들이 실제로 무엇을 가정할지 알 수 없습니다.
문자열과 마찬가지로 행렬의 foibles도 잘 알려져 있습니다. 예를 들어 행렬 곱셈 (즉, 내적 곱 곱셈 행렬Matrix operator* (double, Matrix)
) 인 경우 스칼라 곱셈 임을 알 Matrix operator* (Matrix, Matrix)
수 있습니다 .
마찬가지로 대리자와 함께 연산자를 사용하는 것은 수학에서 너무 멀리 제거되어 실수를 범할 가능성이 없습니다.
또한 2011 년 ACCU 회의 에서 Roger Orr & Steve Love 는 일부 객체는 다른 객체보다 평등, 가치 및 정체성의 많은 의미를 살펴 보는 세션을 발표했습니다 . 그들의 슬라이드를 다운로드 할 수 있습니다 리처드 해리스 '있는 그대로, 부동 소수점 평등에 대한 부록 . 요약 : 매우주의 와 operator==
여기, 용 수!
연산자 오버로딩은 매우 강력한 의미 론적 기술이지만 사용하기 쉽습니다. 이상적으로는 과부하 된 연산자의 영향이 무엇인지 컨텍스트에서 매우 분명한 상황에서만 사용해야합니다. 여러 가지면에서 a.union(b)
보다 명확 a+b
하고 a*b
있습니다 훨씬 더 애매한 이상의 a.cartesianProduct(b)
카티 제품의 결과가 될 것 특히 이후, SetLike<Tuple<T,T>>
(A)보다 다소을 SetLike<T>
.
프로그래머 오버로드의 실제 문제는 프로그래머가 클래스가 어떤 방식으로 동작한다고 가정 할 때 발생하지만 실제로는 다른 방식으로 동작합니다. 이런 종류의 의미 충돌은 피하는 것이 중요하다고 제안하는 것입니다.