適切な演算子のオーバーロードの明らかな例は、数値が動作するのと同じように動作するクラスです。だから、のBigIntクラス(とJalaynが示唆)、複素数や行列クラス(とSuperbestが示唆)、すべての普通の数字がそうしながら、算術演算子に本当にうまくマッピングされているのと同じ操作をしていた時間によって示唆されているように(操作svickを)サブセットにうまくマップそれらの操作の。
少し抽象的には、演算子をセットのような操作を実行するときに使用operator+
できるため、ユニオン、補数などにoperator-
なる可能性があります。これは、特に、 t 可換、期待どおりに。
C#自体には、非数値演算子のオーバーロードの優れた例があります。を使用+=
し-=
て、デリゲートを追加および削除します。つまり、デリゲートを登録および登録解除します。+=
and -=
演算子は期待どおりに機能するため、これはうまく機能します。これにより、はるかに簡潔なコードが作成されます。
純粋主義者にとって、文字列+
演算子の問題の1つは、それが可換でないことです。"a"+"b"
はと同じではありません"b"+"a"
。この例外は文字列について非常に一般的であるため理解していますがoperator+
、他の型での使用が可換かどうかをどのように判断できますか?オブジェクトが文字列のようなものでない限り、ほとんどの人はそうだと思いますで実際に人々が何を仮定するかは決してわかりません。
文字列と同様に、行列の脆弱性もよく知られています。がMatrix operator* (double, Matrix)
スカラー乗算であることは明らかですがMatrix operator* (Matrix, Matrix)
、行列乗算であることは明らかですインスタンス(すなわち、A行列ドット積乗算)。
同様に、デリゲートでの演算子の使用は明らかに数学からかなり離れているため、これらの間違いを犯す可能性は低いです。
ちなみに、2011年のACCU会議で、ロジャーオアとスティーブラブは、他のオブジェクトよりも平等であるオブジェクトについてのセッションを発表しました。彼らのスライドは、Richard Harrisの浮動小数点の平等に関する付録と同様にダウンロードできます。概要:、ここではドラゴンに注意してくださいoperator==
!
演算子のオーバーロードは非常に強力なセマンティック手法ですが、使いすぎることは簡単です。理想的には、オーバーロードされた演算子の効果がコンテキストから非常に明確な状況でのみ使用する必要があります。多くの点でa.union(b)
より明確でa+b
あり、a*b
ある非常に多くの無名のよりa.cartesianProduct(b)
デカルト積の結果は次のようになり、特に以来、SetLike<Tuple<T,T>>
ではなくASetLike<T>
。
オペレーターのオーバーロードに関する実際の問題は、プログラマーがクラスが1つの方法で動作すると想定しているが、実際には別の方法で動作する場合に発生します。この種のセマンティッククラッシュは、回避しようとすることが重要であることを示唆しています。