Các ví dụ rõ ràng về quá tải toán tử thích hợp là bất kỳ lớp nào hoạt động giống như cách các số hoạt động. Vì vậy, bigint lớp (như Jalayn gợi ý), số phức hoặc ma trận lớp (như Superbest gợi ý) tất cả đều có các hoạt động tương tự mà con số bình thường đã rất bản đồ thực sự tốt vào khai thác toán học, trong khi thời gian hoạt động (theo đề nghị của svick ) bản đồ độc đáo vào một tập hợp con của những hoạt động đó.
Tóm tắt hơn, các toán tử có thể được sử dụng khi thực hiện tập hợp như các phép toán, vì vậy operator+
có thể là một phép hợp , operator-
có thể là phần bù, v.v ... Điều này bắt đầu kéo dài mô hình, đặc biệt là nếu bạn sử dụng toán tử cộng hoặc nhân cho một thao tác không phải là ' t giao hoán , như bạn có thể mong đợi chúng được.
Bản thân C # có một ví dụ tuyệt vời về quá tải toán tử không số . Nó sử dụng +=
và -=
để cộng và trừ các đại biểu , tức là đăng ký và hủy đăng ký chúng. Điều này hoạt động tốt bởi vì +=
và các -=
toán tử hoạt động như bạn mong đợi, và điều này dẫn đến mã ngắn gọn hơn nhiều.
Đối với người theo chủ nghĩa thuần túy, một trong những vấn đề với +
toán tử chuỗi là nó không giao hoán. "a"+"b"
không giống như "b"+"a"
. Chúng tôi hiểu ngoại lệ này cho các chuỗi vì nó rất phổ biến, nhưng làm thế nào chúng ta có thể biết nếu sử dụng operator+
trên các loại khác sẽ có giao hoán hay không? Hầu hết mọi người sẽ cho rằng nó là như vậy, trừ khi đối tượng giống như chuỗi , nhưng bạn không bao giờ thực sự biết mọi người sẽ giả định gì.
Cũng như các chuỗi, các phần tử của ma trận cũng khá nổi tiếng. Rõ ràng đó Matrix operator* (double, Matrix)
là một phép nhân vô hướng, trong khi đó Matrix operator* (Matrix, Matrix)
sẽ là một phép nhân ma trận (ví dụ như một ma trận của phép nhân sản phẩm chấm).
Tương tự như vậy, việc sử dụng các toán tử với các đại biểu rõ ràng đã bị loại bỏ khỏi toán học đến mức bạn khó có thể mắc phải những sai lầm đó.
Tình cờ, tại hội nghị ACCU 2011 , Roger Orr & Steve Love đã trình bày một phiên về Một số đối tượng bình đẳng hơn những đối tượng khác - một cái nhìn về nhiều ý nghĩa của sự bình đẳng, giá trị và bản sắc . Các slide của họ có thể tải xuống , như Phụ lục của Richard Harris về sự bình đẳng điểm nổi . Tóm tắt: Hãy thật cẩn thận với operator==
, đây là những con rồng!
Quá tải toán tử là một kỹ thuật ngữ nghĩa rất mạnh, nhưng nó dễ sử dụng quá mức. Lý tưởng nhất là bạn chỉ nên sử dụng nó trong các tình huống khi nó rất rõ ràng từ ngữ cảnh tác động của một toán tử quá tải là gì. Trong nhiều cách a.union(b)
rõ hơn a+b
, và a*b
là nhiều hơn che khuất hơn a.cartesianProduct(b)
, đặc biệt là kể từ khi kết quả của một sản phẩm Descartes sẽ là một SetLike<Tuple<T,T>>
chứ không phải là một SetLike<T>
.
Các vấn đề thực sự với quá tải toán tử xuất hiện khi một lập trình viên giả định một lớp sẽ hành xử theo một cách, nhưng nó thực sự hành xử theo cách khác. Loại xung đột ngữ nghĩa này là những gì tôi cho rằng điều quan trọng là phải cố gắng tránh.