มีสถานที่ใดบ้างในโลกแห่งความเป็นจริงที่เรียกร้องให้มีตัวแทน ฉันอยากรู้ว่ามีสถานการณ์หรือรูปแบบใดบ้างที่วิธีนี้เป็นทางออกที่ดีที่สุด ไม่ต้องใช้รหัส
มีสถานที่ใดบ้างในโลกแห่งความเป็นจริงที่เรียกร้องให้มีตัวแทน ฉันอยากรู้ว่ามีสถานการณ์หรือรูปแบบใดบ้างที่วิธีนี้เป็นทางออกที่ดีที่สุด ไม่ต้องใช้รหัส
คำตอบ:
ผู้รับมอบสิทธิ์คือชื่อประเภทที่กำหนดวิธีการเฉพาะ เช่นเดียวกับคำจำกัดความของคลาสที่จัดวางสมาชิกทั้งหมดสำหรับชนิดของอ็อบเจ็กต์ที่กำหนดผู้ร่วมประชุมจะวางลายเซ็นเมธอดสำหรับชนิดของวิธีการที่กำหนด
จากคำสั่งนี้ผู้ร่วมประชุมเป็นตัวชี้ฟังก์ชันและกำหนดลักษณะของฟังก์ชันนั้น
ตัวอย่างที่ดีสำหรับการใช้งานจริงในโลกของผู้แทนเป็นคำกริยา ในตัวอย่างจากลิงค์คุณจะสังเกตเห็นว่าArray.Findใช้อาร์เรย์เพื่อค้นหาจากนั้นเพรดิเคตเพื่อจัดการกับเกณฑ์ของสิ่งที่จะค้นหา ในกรณีนี้จะส่งผ่านเมธอด ProductGT10 ซึ่งตรงกับลายเซ็นเพรดิเคต
ตามที่ระบุไว้ใน"Learning C # 3.0: Master the fundamentals of C # 3.0"
สถานการณ์ทั่วไป: เมื่อประมุขแห่งรัฐเสียชีวิตประธานาธิบดีแห่งสหรัฐอเมริกามักจะไม่มีเวลาไปร่วมงานศพเป็นการส่วนตัว เขาส่งตัวแทนไปแทน บ่อยครั้งที่ผู้ได้รับมอบหมายนี้เป็นรองประธานาธิบดี แต่บางครั้งรองประธานก็ไม่พร้อมให้บริการและประธานาธิบดีจะต้องส่งคนอื่นเช่นเลขาธิการแห่งรัฐหรือแม้แต่สุภาพสตรีหมายเลขหนึ่ง เขาไม่ต้องการ "เดินสาย" มอบอำนาจให้กับบุคคลคนเดียว เขาอาจมอบหมายความรับผิดชอบนี้ให้กับทุกคนที่สามารถดำเนินการตามโปรโตคอลสากลที่ถูกต้อง
ประธานาธิบดีกำหนดล่วงหน้าว่าจะได้รับมอบหมายความรับผิดชอบอะไร (เข้าร่วมงานศพ) พารามิเตอร์ใดที่จะถูกส่งผ่าน (แสดงความเสียใจคำพูดแสดงความกรุณา) และคุณค่าที่เขาหวังว่าจะได้รับกลับมา (ด้วยความปรารถนาดี) จากนั้นเขามอบหมายให้บุคคลใดบุคคลหนึ่งเป็นผู้รับผิดชอบที่ได้รับมอบหมายที่“ รันไทม์” เมื่อเส้นทางการดำรงตำแหน่งประธานาธิบดีของเขาดำเนินไป
ในสถานการณ์การเขียนโปรแกรม: คุณมักจะต้องเผชิญกับสถานการณ์ที่คุณต้องดำเนินการบางอย่าง แต่คุณไม่รู้ล่วงหน้าว่าจะใช้วิธีใดหรือแม้แต่วัตถุใดที่คุณต้องการเรียกใช้ให้ดำเนินการ
ตัวอย่างเช่น ปุ่มอาจไม่ทราบว่าต้องแจ้งวัตถุหรือวัตถุใด แทนที่จะเดินสายปุ่มไปยังออบเจ็กต์เฉพาะคุณจะเชื่อมต่อปุ่มกับผู้รับมอบสิทธิ์จากนั้นแก้ไขการมอบหมายนั้นให้เป็นวิธีการเฉพาะเมื่อโปรแกรมดำเนินการ
การใช้งานทั่วไปอย่างหนึ่งของผู้รับมอบสิทธิ์สำหรับรายการทั่วไปคือผ่านทางผู้รับมอบสิทธิ์การดำเนินการ (หรือสิ่งที่เทียบเท่าที่ไม่ระบุชื่อ) เพื่อสร้างการดำเนินการ foreach หนึ่งบรรทัด:
myList.Foreach( i => i.DoSomething());
ฉันยังพบว่าผู้รับมอบสิทธิ์พรีดิเคตมีประโยชน์มากในการค้นหาหรือตัดทอนรายการ:
myList.FindAll( i => i.Name == "Bob");
myList.RemoveAll( i => i.Name == "Bob");
ฉันรู้ว่าคุณบอกว่าไม่ต้องใช้รหัส แต่ฉันพบว่ามันง่ายกว่าที่จะแสดงประโยชน์ผ่านรหัส :)
การผูกเหตุการณ์กับตัวจัดการเหตุการณ์มักจะเป็นการแนะนำผู้ร่วมประชุมเป็นครั้งแรก ... คุณอาจไม่รู้ด้วยซ้ำว่าคุณกำลังใช้งานอยู่เนื่องจากผู้รับมอบสิทธิ์ถูกรวมไว้ในคลาส EventHandler
หากคุณสนใจที่จะดูว่ารูปแบบ Delegate ใช้ในโค้ดในโลกแห่งความเป็นจริงอย่างไรไม่ต้องมองหาที่ไหนไกลนอกจาก Cocoa บน Mac OS X Cocoa เป็นชุดเครื่องมือ UI ที่เป็นที่ต้องการของ Apple สำหรับการเขียนโปรแกรมภายใต้ Mac OS X และมีการเข้ารหัสใน Objective C ออกแบบมาเพื่อให้องค์ประกอบ UI แต่ละส่วนถูกขยายผ่านการมอบหมายมากกว่าการคลาสย่อยหรือวิธีการอื่น ๆ
สำหรับข้อมูลเพิ่มเติมผมขอแนะนำให้ตรวจสอบสิ่งที่แอปเปิ้ลได้กล่าวเกี่ยวกับผู้ได้รับมอบหมายที่นี่
ฉันมีโครงการที่ใช้ win32 Python
เนื่องจากสาเหตุหลายประการบางโมดูลจึงใช้ odbc.py เพื่อเข้าถึง DB และโมดูลอื่น ๆ - pyodbc.py
เกิดปัญหาเมื่อจำเป็นต้องใช้ฟังก์ชันกับโมดูลทั้งสองประเภท มันมีออบเจ็กต์การเชื่อมต่อที่ส่งผ่านไปยังอาร์กิวเมนต์ แต่ก็ต้องรู้ว่าจะใช้ dbi.dbiDate หรือวันที่เวลาเพื่อแสดงเวลา
เนื่องจากคาดว่า odbc.py เป็นค่าในคำสั่ง SQL วันที่เป็น dbi.dbiDate ในขณะที่ pyodbc.py คาดหวังค่าวันที่และเวลา
ความซับซ้อนอีกอย่างหนึ่งคืออ็อบเจ็กต์การเชื่อมต่อที่สร้างโดย odbc.py และ pyodbc.py ไม่อนุญาตให้ตั้งค่าฟิลด์เพิ่มเติม
วิธีแก้ปัญหาของฉันคือการรวมอ็อบเจกต์การเชื่อมต่อที่ส่งคืนโดย odbc.odbc (... ) และ pyodbc.pyodbc (... ) โดยคลาส delegate ซึ่งมีฟังก์ชันการแทนเวลาที่ต้องการเป็นค่าของฟิลด์พิเศษและผู้รับมอบสิทธิ์ใด การร้องขอฟิลด์อื่น ๆ ทั้งหมดไปยังออบเจ็กต์การเชื่อมต่อดั้งเดิม
ฉันมีคำถามเดียวกับคุณและไปที่ไซต์นี้เพื่อหาคำตอบ
เห็นได้ชัดว่าฉันไม่เข้าใจมันดีขึ้นแม้ว่าฉันจะอ่านตัวอย่างในหัวข้อนี้
ตอนนี้ฉันพบการใช้งานที่ยอดเยี่ยมสำหรับผู้ร่วมประชุมที่ฉันอ่าน: http://www.c-sharpcorner.com/UploadFile/thiagu304/passdata05172006234318PM/passdata.aspx
สิ่งนี้อาจดูเหมือนชัดเจนสำหรับผู้ใช้ใหม่เนื่องจากแบบฟอร์มมีความซับซ้อนในการส่งผ่านค่ามากกว่าเว็บไซต์ ASP.NET ที่มี POST / GET (QueryString) ..
โดยทั่วไปคุณกำหนดผู้รับมอบสิทธิ์ซึ่งรับ"TextBox text "เป็นพารามิเตอร์
// Form1
// Class Property Definition
public delegate void delPassData(TextBox text);
// Click Handler
private void btnSend_Click(object sender, System.EventArgs e)
{
Form2 frm= new Form2();
delPassData del=new delPassData(frm.funData);
del(this.textBox1);
frm.Show();
}
// สรุป: กำหนดการมอบหมายสร้างอินสแตนซ์คลาส Form2 ใหม่กำหนดฟังก์ชัน funData () เพื่อมอบสิทธิ์ส่งผ่าน textBox ของคุณไปยังผู้รับมอบสิทธิ์ แสดงแบบฟอร์ม
// แบบ 2
public void passData(TextBox txtForm1)
{
label1.Text = txtForm1.Text;
}
// สรุป: เพียงแค่ใช้ TextBox txtForm1 เป็นพารามิเตอร์ (ตามที่กำหนดไว้ในผู้รับมอบสิทธิ์ของคุณ) และกำหนดข้อความป้ายกำกับให้กับข้อความของ textBox
ฉันหวังว่าสิ่งนี้จะช่วยให้ความกระจ่างในการใช้งานกับผู้ได้รับมอบหมาย :) ..