Di mana saya menggunakan delegasi? [Tutup]


109

Apa sajakah tempat dunia nyata yang membutuhkan delegasi? Saya ingin tahu situasi atau pola apa yang ada di mana metode ini adalah solusi terbaik. Tidak ada kode yang dibutuhkan.

Jawaban:


33

Delegasi adalah tipe bernama yang mendefinisikan jenis metode tertentu. Sama seperti definisi kelas yang menjabarkan semua anggota untuk jenis objek tertentu yang didefinisikannya, delegasi menjabarkan tanda tangan metode untuk jenis metode yang didefinisikannya.

Berdasarkan pernyataan ini, delegasi adalah penunjuk fungsi dan mendefinisikan seperti apa fungsi itu.

Contoh bagus untuk penerapan delegasi di dunia nyata adalah Predikat . Dalam contoh dari tautan, Anda akan melihat bahwa Array.Find mengambil array untuk mencari dan kemudian predikat untuk menangani kriteria dari apa yang harus ditemukan. Dalam hal ini, ia melewati metode ProductGT10 yang cocok dengan tanda tangan Predikat.


154

Seperti yang dinyatakan dalam "Belajar C # 3.0: Menguasai dasar-dasar C # 3.0"

Skenario Umum: Ketika seorang kepala negara meninggal, Presiden Amerika Serikat biasanya tidak punya waktu untuk menghadiri pemakaman secara pribadi. Sebaliknya, dia mengirimkan seorang delegasi. Seringkali delegasi ini adalah Wakil Presiden, tetapi terkadang Wakil Presiden berhalangan dan Presiden harus mengirim orang lain, seperti Sekretaris Negara atau bahkan Ibu Negara. Dia tidak ingin “mengikat” otoritas yang didelegasikannya kepada satu orang; dia mungkin mendelegasikan tanggung jawab ini kepada siapa saja yang mampu melaksanakan protokol internasional yang benar.

Presiden menetapkan terlebih dahulu tanggung jawab apa yang akan didelegasikan (menghadiri pemakaman), parameter apa yang akan diteruskan (belasungkawa, kata-kata baik), dan nilai apa yang ia harapkan (niat baik). Dia kemudian menugaskan orang tertentu ke tanggung jawab yang didelegasikan itu pada "runtime" seiring jalannya masa kepresidenannya.

Dalam Skenario Pemrograman: Anda sering dihadapkan pada situasi di mana Anda perlu menjalankan tindakan tertentu, tetapi Anda tidak tahu sebelumnya metode mana, atau bahkan objek mana, yang ingin Anda panggil untuk menjalankannya.

Sebagai Contoh: Sebuah tombol mungkin tidak mengetahui objek atau objek mana yang perlu diberitahukan. Daripada memasang kabel tombol ke objek tertentu, Anda akan menghubungkan tombol ke delegasi dan kemudian menyelesaikan delegasi itu ke metode tertentu saat program dijalankan.


1
Mengapa tidak menggunakan fungsi anonim / lambda saja?
Pacerier

5
@Pacerier Ini adalah respons yang terlambat dan Anda mungkin telah menemukan jawabannya, tetapi demi pembaca lain yang menemukan ini: fungsi anonim adalah jenis delegasi.
Anthony

10
@ Anthony + Pacerier: Metode anoymous BUKANLAH delegasi. Metode anonim adalah sepotong kode. Delegasi adalah penunjuk yang menunjuk ke bagian kode itu. Anda tidak dapat memiliki metode anoymous tanpa seorang delegasi menunjuk padanya, jika tidak maka metode itu tidak akan pernah dipanggil. Lambda adalah operator, digunakan untuk membuat ekspresi lambda. Ekspresi lambda sebagian besar menghasilkan metode anoymous yang akan ditunjukkan oleh ... seorang delegasi.
Martin Mulder

Konyolnya saya, tapi saya hanya akan membuat pernyataan If ElseIf jika saya tidak tahu kegunaannya saat tombol ditekan. Saya mengatakan saya konyol.
JustJohn

Metode anonim @Pacerier diperkenalkan di C # 2.0 dan Lambda diperkenalkan di C # 3.0 jika Lambda diperkenalkan lebih dulu, tidak akan pernah ada metode anonim dan bahkan mendelegasikan!
AminM

18

Satu penggunaan umum delegasi untuk Daftar generik adalah melalui delegasi Tindakan (atau padanan anonimnya) untuk membuat operasi satu baris untuk setiap operasi:

myList.Foreach( i => i.DoSomething());

Saya juga menemukan delegasi Predikat cukup berguna dalam mencari atau memangkas Daftar:

myList.FindAll( i => i.Name == "Bob");    
myList.RemoveAll( i => i.Name == "Bob");

Saya tahu Anda mengatakan tidak ada kode yang diperlukan, tetapi saya merasa lebih mudah untuk mengungkapkan kegunaannya melalui kode. :)


13

Mengikat Event ke Event Handler biasanya merupakan perkenalan pertama Anda kepada delegasi ... Anda bahkan mungkin tidak tahu Anda menggunakannya karena delegasi dibungkus dalam kelas EventHandler.


5

Jika Anda tertarik untuk melihat bagaimana pola Delegasi digunakan dalam kode dunia nyata, tidak terlihat lagi selain Cocoa di Mac OS X. Cocoa adalah perangkat UI pilihan Apple untuk pemrograman di bawah Mac OS X, dan dikodekan di Objective C. Ini dirancang sedemikian rupa sehingga setiap komponen UI dimaksudkan untuk diperluas melalui pendelegasian daripada membuat subkelas atau cara lain.

Untuk informasi lebih lanjut, saya sarankan untuk memeriksa apa yang dikatakan Apple tentang delegasi di sini .


5

Saya memiliki proyek yang menggunakan win32 Python.

Karena berbagai alasan, beberapa modul menggunakan odbc.py untuk mengakses DB, dan modul lainnya - pyodbc.py.

Ada masalah saat suatu fungsi harus digunakan oleh kedua jenis modul. Itu memiliki objek koneksi yang diteruskan ke sana sebagai argumen, tetapi kemudian harus tahu apakah akan menggunakan dbi.dbiDate atau datetime untuk mewakili waktu.

Ini karena odbc.py diharapkan, sebagai nilai dalam pernyataan SQL, tertanggal sebagai dbi.dbiDate sedangkan pyodbc.py mengharapkan nilai datetime.

Satu komplikasi lebih lanjut adalah bahwa objek koneksi yang dibuat oleh odbc.py dan pyodbc.py tidak mengizinkan seseorang untuk menyetel bidang tambahan.

Solusi saya adalah membungkus objek koneksi yang dikembalikan oleh odbc.odbc (...) dan pyodbc.pyodbc (...) oleh kelas delegasi, yang berisi fungsi representasi waktu yang diinginkan sebagai nilai bidang tambahan, dan yang mendelegasikan semua permintaan bidang lainnya ke objek koneksi asli.


5

Saya memiliki pertanyaan yang sama dengan Anda dan pergi ke situs ini untuk mendapatkan jawaban.

Rupanya, saya tidak memahaminya dengan lebih baik meskipun saya membaca sekilas contoh di utas ini.

Saya menemukan kegunaan yang bagus untuk delegasi sekarang setelah saya membaca: http://www.c-sharpcorner.com/UploadFile/thiagu304/passdata05172006234318PM/passdata.aspx

Ini mungkin tampak lebih jelas bagi pengguna baru karena Formulir jauh lebih rumit untuk meneruskan nilai daripada situs web ASP.NET dengan POST / GET (QueryString) ..

Pada dasarnya Anda menentukan delegasi yang menggunakan " teks TextBox " sebagai parameter.

// Formulir1

// 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();
}

// RINGKASAN: Tentukan delegasi, buat instance kelas Form2 baru, tetapkan fungsi funData () untuk mendelegasikan, teruskan textBox Anda ke delegasi. Tunjukkan formulirnya.

// Formulir2

public void passData(TextBox txtForm1)
{

     label1.Text = txtForm1.Text;
}

// RINGKASAN: Cukup gunakan TextBox txtForm1 sebagai parameter (seperti yang didefinisikan dalam delegasi Anda) dan tetapkan teks label ke teks textBox.

Saya harap ini mencerahkan beberapa penggunaan pada delegasi :) ..


Entah metode kelas Form2 perlu diberi nama funData (bukan passData), atau penetapan fungsi Form1 perlu dinamai frm.passData (bukan frm.funData).
ethan

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.