Contoh nyata dari overloading operator yang tepat adalah setiap kelas yang berperilaku dengan cara yang sama seperti angka beroperasi. Jadi BigInt kelas (sebagai Jalayn menyarankan), bilangan kompleks atau matriks kelas (sebagai Superbest menyarankan) semua memiliki operasi yang sama yang nomor biasa telah begitu memetakan dengan sangat baik ke operator matematika, sementara waktu operasi (seperti yang disarankan oleh svick ) map baik ke subset dari operasi tersebut.
Sedikit lebih abstrak, operator dapat digunakan ketika melakukan operasi seperti set , sehingga operator+
bisa menjadi gabungan , operator-
bisa menjadi pelengkap, dll. Ini memang mulai memperluas paradigma, terutama jika Anda menggunakan operator penambahan atau gandakan untuk operasi yang tidak t komutatif , seperti yang Anda harapkan.
C # sendiri memiliki contoh kelebihan operator non-numerik . Ia menggunakan +=
dan -=
untuk menambah dan mengurangi delegasi , yaitu mendaftar dan tidak mendaftar. Ini bekerja dengan baik karena operator +=
dan -=
bekerja seperti yang Anda harapkan, dan ini menghasilkan kode yang lebih ringkas.
Untuk purist, salah satu masalah dengan +
operator string adalah ia tidak komutatif. "a"+"b"
tidak sama dengan "b"+"a"
. Kami memahami pengecualian untuk string ini karena itu sangat umum, tetapi bagaimana kami bisa tahu apakah menggunakan operator+
pada tipe lain akan komutatif atau tidak? Kebanyakan orang akan berasumsi bahwa itu adalah, kecuali objeknya seperti string , tetapi Anda tidak pernah benar-benar tahu apa yang akan diasumsikan orang.
Seperti halnya string, kelemahan matriks juga cukup terkenal. Jelas bahwa itu Matrix operator* (double, Matrix)
adalah perkalian skalar, sedangkan Matrix operator* (Matrix, Matrix)
akan menjadi perkalian matriks (yaitu matriks perkalian titik-produk) misalnya.
Demikian pula penggunaan operator dengan delegasi jelas sekali jauh dari matematika sehingga Anda tidak mungkin membuat kesalahan itu.
Kebetulan, pada konferensi ACCU 2011 , Roger Orr & Steve Love mempresentasikan sesi tentang beberapa objek yang lebih setara daripada yang lain - lihat banyak makna persamaan, nilai, dan identitas . Slide-slide mereka dapat diunduh , seperti Lampiran Richard Harris tentang kesetaraan floating point . Ringkasan: Berhati-hatilah dengan operator==
, ini naga!
Overloading operator adalah teknik semantik yang sangat kuat, tetapi mudah digunakan secara berlebihan. Idealnya Anda hanya boleh menggunakannya dalam situasi ketika sangat jelas dari konteks apa efek dari operator kelebihan beban. Dalam banyak hal a.union(b)
lebih jelas daripada a+b
, dan a*b
adalah jauh lebih jelas daripada a.cartesianProduct(b)
, terutama karena hasil produk Cartesian akan menjadi SetLike<Tuple<T,T>>
daripada SetLike<T>
.
Masalah sebenarnya dengan overloading operator datang ketika seorang programmer menganggap suatu kelas akan berperilaku dalam satu cara, tetapi sebenarnya berperilaku di lain. Bentrokan semantik semacam ini adalah apa yang saya sarankan penting untuk dihindari.