Uygun operatör aşırı yüklemesinin bariz örnekleri, sayıların çalıştığı gibi davranan sınıflardır. Böylece BigInt sınıfları ( Jalayn'ın önerdiği gibi), karmaşık sayılar veya matris sınıfları ( Superbest'in önerdiği gibi), sıradan sayıların matematiksel operatörlerle gerçekten çok iyi eşleştiği işlemlere sahipken, zaman işlemleri ( svick tarafından önerildiği gibi ) bir alt kümeye güzelce eşlenir bu operasyonların.
Gerçekleştirirken Biraz daha soyut, operatörler kullanılabilir gibi set operasyonları yüzden, operator+
bir olabilir birlik , operator-
bir olabilir tamamlayıcı hangi değil mi' bir operasyon için eklenmesi veya çarpma operatörünü kullanmak, özellikle vb Gerçi paradigma germek için başlıyor t Değişmeli olarak , beklediğiniz gibi.
C # 'ın kendisi, sayısal olmayan operatör aşırı yüklemesinin mükemmel bir örneğine sahiptir . Delege eklemek ve çıkarmak için kullanır +=
ve kullanır , yani onları kaydeder ve -=
kayıttan çıkarır . Bu işleri iyi çünkü ve çok daha özlü kod onları etmek ve bu sonucu beklediğiniz gibi operatörler çalışma.+=
-=
Purist için, string +
operatörünün sorunlarından biri, değişmeli olmamasıdır. "a"+"b"
ile aynı değildir "b"+"a"
. Dizeler için bu istisnayı çok yaygın olduğu için anlıyoruz , ancak operator+
diğer türlerde kullanmanın değişmeli olup olmayacağını nasıl anlayabiliriz ? Nesne string benzeri olmadığı sürece çoğu insan bunun olduğunu varsayar , ancak insanların ne alacağını asla bilemezsiniz.
Dizelerde olduğu gibi, matrislerin foları da oldukça iyi bilinmektedir. Açıktır Matrix operator* (double, Matrix)
ise skalar çarpım olduğu Matrix operator* (Matrix, Matrix)
bir olacaktır matris çarpımını , örneğin (örneğin, matris bir nokta ürünün çarpmaların).
Benzer şekilde delegeleri olan operatörlerin kullanımı, matematikten o kadar uzaktır ki, bu hataları yapma ihtimaliniz düşüktür.
Bu arada, en 2011 ACCU toplantısında , Roger Orr & Steve Aşk kaç defa oturum sunulan eşitlik, değer ve kimlik birçok anlamları göz - Bazı nesneler diğerlerinden daha eşittir . Onların slaytlar indirilebilir Richard Harris'in olduğu gibi, kayan nokta eşitlik Ek . Özet: Çok dikkatli ol ile operator==
burada, ejderhalar olun!
Operatör aşırı yüklemesi çok güçlü bir semantik tekniktir, ancak aşırı kullanımı kolaydır. İdeal olarak, sadece aşırı yüklenmiş bir operatörün etkisinin ne olduğu bağlamdan çok açık olduğu durumlarda kullanmalısınız. Birçok yönden a.union(b)
daha nettir a+b
ve a*b
bir çok daha karanlık daha a.cartesianProduct(b)
bir kartezyen çarpımının sonucu bir olurdu, özellikle de SetLike<Tuple<T,T>>
bir yerine SetLike<T>
.
Operatörün aşırı yüklenmesi ile ilgili gerçek sorunlar, bir programcı bir sınıfın bir şekilde davranacağını varsayar, ancak aslında başka bir şekilde davranır. Bu tür anlamsal çatışma, kaçınmaya çalışmanın önemli olduğunu önerdiğim şeydir.