ตัวอย่างที่ชัดเจนของการบรรทุกเกินพิกัดที่เหมาะสมคือคลาสใด ๆ ที่ทำงานในลักษณะเดียวกับที่ใช้งานตัวเลข ดังนั้นbigintเรียน (ตามJalaynแสดงให้เห็น) ตัวเลขที่ซับซ้อนหรือเมทริกซ์ชั้นเรียน (ตามSuperbestแสดงให้เห็น) ทุกคนมีการดำเนินงานเดียวกันว่าตัวเลขสามัญได้ map เพื่อให้ได้ดีจริงๆบนดำเนินการทางคณิตศาสตร์ในขณะที่เวลาการดำเนินงาน (แนะนำโดยsvick ) แผนที่อย่างบนย่อย ของการดำเนินงานเหล่านั้น
เล็กน้อย abstractly ผู้ประกอบการสามารถนำมาใช้เมื่อดำเนินการชุดเช่นการดำเนินงานดังนั้นoperator+
อาจจะเป็นสหภาพ , operator-
อาจจะเป็นส่วนเติมเต็มฯลฯ นี้ไม่เริ่มต้นที่จะยืดกระบวนทัศน์แม้ว่าโดยเฉพาะอย่างยิ่งถ้าคุณใช้นอกจากนี้ผู้ประกอบการหรือคูณสำหรับการดำเนินงานซึ่ง ISN' เกิด ไม่ต้องสับเปลี่ยนอย่างที่คุณคาดหวัง
C # มีตัวอย่างที่ยอดเยี่ยมของการใช้งานตัวดำเนินการมากเกินไปที่ไม่ใช่ตัวเลข มันใช้+=
และ-=
เพื่อเพิ่มและลบผู้ได้รับมอบหมายเช่นลงทะเบียนและยกเลิกการลงทะเบียนพวกเขา วิธีนี้ใช้งานได้ดีเนื่องจากตัวดำเนินการ+=
และ-=
ตัวดำเนินการทำงานตามที่คุณคาดไว้และทำให้โค้ดที่กระชับยิ่งขึ้น
สำหรับคนพิถีพิถันปัญหาอย่างหนึ่งของตัว+
ดำเนินการสตริงคือมันไม่ได้สลับกัน ไม่ได้เป็นเช่นเดียวกับ"a"+"b"
"b"+"a"
เราเข้าใจข้อยกเว้นนี้สำหรับสตริงเพราะมันเป็นเรื่องธรรมดา แต่เราจะบอกได้อย่างไรว่าการใช้operator+
กับประเภทอื่นจะเป็นแบบสลับกันหรือไม่ คนส่วนใหญ่จะคิดว่ามันเป็นเว้นแต่ว่าวัตถุนั้นเป็นเหมือนสตริงแต่คุณไม่เคยรู้เลยว่าคนอื่นจะสมมติอะไร
เช่นเดียวกับสตริงค่าของเมทริกซ์ที่เป็นที่รู้จักก็ค่อนข้างดีเช่นกัน เห็นได้ชัดว่าMatrix operator* (double, Matrix)
เป็นการคูณสเกลาร์ในขณะที่Matrix operator* (Matrix, Matrix)
จะเป็นการคูณเมทริกซ์ (เช่นเมทริกซ์ของการคูณดอทผลิตภัณฑ์)
ในทำนองเดียวกันการใช้โอเปอเรเตอร์กับผู้รับมอบสิทธิ์จะถูกลบออกไปอย่างชัดเจนจากคณิตศาสตร์ที่คุณไม่น่าจะทำผิดพลาดเหล่านั้น
อนึ่งที่ประชุม ACCU 2011 , โรเจอร์ออร์และสตีฟความรักที่นำเสนอเซสชั่นเกี่ยวกับวัตถุบางอย่างมีค่าเท่ากันมากกว่าคนอื่น ๆ - ดูที่หลายความหมายของความเสมอภาคที่คุ้มค่าและตัวตน ของพวกเขาภาพนิ่งสามารถดาวน์โหลดได้เช่นเดียวกับริชาร์ดแฮร์ริสภาคผนวกเกี่ยวกับความเสมอภาคลอยจุด สรุป: ระวังตัวด้วยoperator==
นี่ต้องเป็นมังกร!
การบรรทุกเกินพิกัดเป็นเทคนิคความหมายที่ทรงพลังมาก แต่ง่ายต่อการใช้งานมากเกินไป เป็นการดีที่คุณควรใช้ในสถานการณ์ที่ชัดเจนมากจากบริบทว่าผลกระทบของโอเปอเรเตอร์ที่โอเวอร์โหลดคืออะไร ในหลาย ๆ วิธีa.union(b)
เป็นที่ชัดเจนกว่าa+b
และa*b
เป็นมากมากขึ้นชัดเจนกว่าa.cartesianProduct(b)
โดยเฉพาะอย่างยิ่งนับตั้งแต่ผลของผลิตภัณฑ์คาร์ทีเซียนจะเป็นมากกว่าSetLike<Tuple<T,T>>
SetLike<T>
ปัญหาที่แท้จริงของตัวดำเนินการโอเวอร์โหลดเกิดขึ้นเมื่อโปรแกรมเมอร์สันนิษฐานว่าคลาสจะทำงานในทิศทางเดียว แต่จริง ๆ แล้วมันจะทำงานในอีกทางหนึ่ง การปะทะแบบ semantic แบบนี้คือสิ่งที่ฉันแนะนำให้พยายามหลีกเลี่ยง