เมื่อกิจกรรมการเขียนโปรแกรมใน C # ขอแนะนำให้สร้างผู้แทนในรูปแบบของ:
delegate XEventHandler(object sender, XEventArgs e);
คำถามของฉันอยู่ที่อาร์กิวเมนต์แรกของผู้รับมอบสิทธิ์object sender
. มันจำเป็นต้องเป็นยาสามัญobject
หรือไม่? การมีผู้ส่งเป็นประเภทobject
จะส่งผลให้เกิดรหัสคล้ายกัน
val = ((ConcreteType)sender).Property;
หรือยิ่ง verbose
ConcreteType obj = sender as ConcreteType
if (obj != null) { ... }
ข้อโต้แย้งอย่างหนึ่งสำหรับผู้ส่งที่พิมพ์อย่างรุนแรงคือวัตถุอื่น ๆ สามารถส่งต่อเหตุการณ์โดยไม่ต้องกังวลเกี่ยวกับประเภท แม้ว่าสิ่งนี้อาจสมเหตุสมผลในสภาพแวดล้อม GUI แต่ฉันไม่แน่ใจว่าจะได้ประโยชน์นอก GUI หรือไม่
ถ้าคลาสของผู้ส่งเป็นที่รู้จักกันเสมอ (อย่างน้อยก็เป็นคลาสนามธรรม)? ตัวอย่างเช่นถ้าฉันกำลังดำเนินการListChanged
จัดกิจกรรมในนามธรรมList
ชั้นและถ้าชั้นเรียนอื่น ๆ จะได้รับมรดก (เช่นLinkedList
, ArrayList
) มันเป็นสิทธิ์ที่จะกำหนดผู้รับมอบสิทธิ์ของฉันที่มีผู้ส่งประเภทList
?
delegate ListChangedEventHander(List sender, ListChangedEventArgs e);
หรือว่าจะมีข้อเสียของการเปลี่ยนแบบเดิมobject sender
เป็นแบบเฉพาะเจาะจงมากขึ้น?