Apa itu Delegasi? [Tutup]


152

Saya bingung apa peran sebenarnya dari seorang delegasi?

Saya telah sering ditanya pertanyaan ini dalam wawancara saya, tetapi saya tidak berpikir bahwa pewawancara puas dengan jawaban saya.

Adakah yang bisa memberi tahu saya definisi terbaik, dalam satu kalimat, dengan contoh praktis?


21
karena penasaran, apa tanggapan Anda sehingga kami dapat memberi tahu Anda bagaimana cara memperbaikinya?
Anthony Forloney

6
Saya merasa menarik bahwa pertanyaan ini ditutup tetapi memiliki 126 suara positif dan 65 orang menandainya sebagai favorit. Sepertinya bahkan jika terlalu luas itu masih merupakan pertanyaan yang sangat bagus.
Kaya

Jawaban:


171

Saya suka menganggap delegasi sebagai "penunjuk ke fungsi". Ini kembali ke hari C, tetapi gagasan itu masih berlaku.

Idenya adalah Anda harus dapat memanggil sepotong kode, tetapi sepotong kode yang akan Anda panggil tidak dikenal sampai runtime. Jadi, Anda menggunakan "delegasi" untuk tujuan itu. Delegasi berguna untuk hal-hal seperti pengendali acara, dan semacamnya, di mana Anda melakukan hal-hal yang berbeda berdasarkan acara yang berbeda, misalnya.

Berikut referensi untuk C # yang dapat Anda lihat:

Dalam C #, misalnya, katakanlah kami memiliki perhitungan yang ingin kami lakukan dan kami ingin menggunakan metode perhitungan lain yang tidak kami ketahui sampai runtime. Jadi kita mungkin memiliki beberapa metode perhitungan seperti ini:

public static double CalcTotalMethod1(double amt)
{
    return amt * .014;
}

public static double CalcTotalMethod2(double amt)
{
    return amt * .056 + 42.43;
}

Kami dapat mendeklarasikan tanda tangan delegasi seperti ini:

public delegate double calcTotalDelegate(double amt);

Dan kemudian kita bisa mendeklarasikan metode yang mengambil delegasi sebagai parameter seperti ini:

public static double CalcMyTotal(double amt, calcTotalDelegate calcTotal)
{
    return calcTotal(amt);
}

Dan kita bisa memanggil CalcMyTotalmetode yang lewat dalam metode delegasi yang ingin kita gunakan.

double tot1 = CalcMyTotal(100.34, CalcTotalMethod1);
double tot2 = CalcMyTotal(100.34, CalcTotalMethod2);
Console.WriteLine(tot1);
Console.WriteLine(tot2);

19
+1 untuk anggukan ke fungsi sederhana namun efektif di C.
Aiden Bell

3
Satu pertanyaan yang terkait dengan jawaban Anda. Apa bedanya dengan memanggil fungsi dengan cara biasa? Hanya karena itu tidak diketahui saat runtime?
Naveed

1
@NAVEED - merujuk pada hasil edit terakhir saya, saya menyertakan sebuah contoh. Sejauh pemanggilan metode aktual, itu tidak terlihat berbeda dari pemanggilan metode normal dalam contoh saya di atas (calcTotal (amt) memanggil delegasi), tetapi kekuatan delegasi adalah bahwa Anda dapat menggunakannya sebagai parameter, dll ketika Anda menginginkan suatu metode untuk dapat memiliki perilaku yang berbeda. Ada banyak hal lain yang dapat Anda gunakan juga, ini hanya contoh sederhana. Semoga itu bisa membantu.
dcp

Ini tidak dikenal pada saat runtime, dan merupakan fungsi yang terikat daripada fungsi bebas - menugaskan metode non-statis Fooke delegasi akan memanggil this.Foo()daripada fungsi statis seperti fungsi pointer akan lakukan (dalam C, Anda sering memiliki void*parameter tambahan untuk lolos thiske penunjuk fungsi)
Pete Kirkham

1
+1 untuk contoh cepat dan efektif membangun kesamaan dengan pointer fungsi di C / C ++. Sangat dihargai!
G21

19

sebuah delegasi hanyalah sebuah pointer fungsi.
sederhananya Anda menetapkan metode yang ingin Anda jalankan delegasi Anda. kemudian dalam kode Anda dapat memanggil metode itu melalui Invoke.

beberapa kode untuk diperagakan (tulis ini dari memori sehingga sintaks mungkin tidak aktif)

delegate void delMyDelegate(object o);

private void MethodToExecute1(object o)
{
    // do something with object
}

private void MethodToExecute2(object o)
{
    // do something else with object
}

private void DoSomethingToList(delMyDelegate methodToRun)
{
    foreach(object o in myList)
        methodToRun.Invoke(o);
}

public void ApplyMethodsToList()
{
    DoSomethingToList(MethodToExecute1);
    DoSomethingToList(MethodToExecute2);
}

16

Diambil dari sini

T Apa yang dimaksud dengan delegasi?
A Ketika suatu objek menerima permintaan, objek dapat menangani permintaan itu sendiri atau meneruskan permintaan ke objek kedua untuk melakukan pekerjaan. Jika objek memutuskan untuk meneruskan permintaan, Anda mengatakan bahwa objek telah meneruskan tanggung jawab untuk menangani permintaan ke objek kedua.

Atau, sebagai contoh pseudo yang mudah: sesuatu mengirim permintaan ke objek1. object1 kemudian meneruskan permintaan dan dirinya sendiri ke object2 - delegate. object2 memproses permintaan dan melakukan beberapa pekerjaan. (catatan: tautan di atas memberikan contoh yang bagus)


Contoh yang diberikan dalam tautan di atas tidak secara tepat menyatakan delegasi.
Hardik9850


4

Delegasi adalah objek yang dapat merujuk ke suatu metode. Jadi, ketika kita membuat delegasi, kita membuat objek yang dapat menyimpan referensi ke suatu metode. Selanjutnya, metode ini dapat dipanggil melalui referensi ini. Dengan demikian, seorang delegasi dapat meminta metode yang dimaksud. Keuntungan utama dari delegasi adalah memungkinkan kita untuk menentukan panggilan ke suatu metode, tetapi metode yang benar-benar dipanggil ditentukan pada saat runtime, bukan pada waktu kompilasi.

Delegasi sederhana

Declaration of delegate:
delegate-modifier delegate return-type delegate-name(parameters)
Implementation of delegate:
Delegate-name delegate-object=new Delegate-name(method of class)

http://knowpacific.wordpress.com/2012/01/26/delegate/


2

Di sini saya akan menjelaskan delegasi, delegasi multicast dan penggunaannya .. Delegasi adalah tipe yang menyimpan referensi metode dalam suatu objek. Ini juga disebut sebagai pointer fungsi tipe aman. Kita dapat mengatakan bahwa delegasi adalah tipe yang mendefinisikan metode tanda tangan.

Saat Anda membuat instance delegasi, Anda dapat mengaitkan instansinya dengan metode apa pun dengan tanda tangan yang kompatibel. Anda dapat meminta (atau memanggil) metode melalui instance delegate. Delegasi digunakan untuk meneruskan metode sebagai argumen ke metode lain. Penangan acara tidak lebih dari metode yang dipanggil melalui delegasi. Keuntungan menggunakan delegasi adalah, Meringkas panggilan metode dari pemanggil Penggunaan efektif delegasi meningkatkan kinerja aplikasi Digunakan untuk memanggil metode secara tidak sinkron. Ada beberapa properti delegasi tersebut

Delegates are like C++ function pointers but are type safe.
Delegates allow methods to be passed as parameters.
Delegates can be used to define callback methods.
Delegates can be chained together; for example, multiple methods can be called on a single event.
Methods do not have to match the delegate signature exactly.

delegate public type_of_delegate delegate_name () // Deklarasi

You can use delegates without parameters or with parameter list
If you are referring to the method with some data type then the delegate which you are declaring should be in the same format. This is why it is referred to as type safe function pointer. Here I am giving an example with String.

Contoh berikut menunjukkan operasi delegasi:

    namespace MyDelegate
    {
        class Program
        {
            private delegate void Show(string s);


            // Create a method for a delegate.
            public static void MyDelegateMethod(string me

ssage)
        {
            System.Console.WriteLine(message);
        }

        static void Main(string[] args)
        {
            Show p = MyDelegateMethod;
            p("My Delegate");
            p.Invoke("My Delegate");
            System.Console.ReadLine();
        }
    }
}

Apa itu Delegasi Multicast?

Ini adalah delegasi yang memegang referensi lebih dari satu metode. Delegasi multicast hanya boleh berisi metode yang mengembalikan batal, kalau tidak ada pengecualian run-time.

 delegate void MyMulticastDelegate(int i, string s);
 Class Class2
 {
  static void MyFirstDelegateMethod(int i, string s)
  {
    Console.WriteLine("My First Method");
  }

  static void MySecondDelegateMethod(int i, string s)
  {
    Console.WriteLine("My Second Method");
  }

  static void Main(string[] args)
  {
    MyMulticastDelegate Method= new MyMulticastDelegate(MyFirstDelegateMethod);
    Method+= new MyMulticastDelegate (MySecondDelegateMethod);
    Method(1,"Hi");             // Calling 2 Methodscalled
    Method-= new MyMulticastDelegate (MyFirstDelegateMethod);
    Method(2,"Hi");             //Only 2nd Method calling
  }
}

Di sini Delegasi ditambahkan menggunakan operator + = dan dihapus menggunakan operator - =.

Jenis delegasi berasal dari kelas Delegasi di .NET Framework. Jenis delegasi disegel — mereka tidak dapat diturunkan. Karena delegasi instantiated adalah objek, ia dapat dikirimkan sebagai parameter, atau ditugaskan ke properti. Ini memungkinkan metode untuk menerima delegasi sebagai parameter, dan memanggil delegasi di lain waktu. Ini dikenal sebagai panggilan balik asinkron.


1

Penjelasan yang bagus dan implementasi praktis dari pola Delegasi dapat ditemukan di Kelas Penerusan Koleksi Google (juga, pola Dekorator).


1

Dalam komunikasi Acara, pengirim tidak tahu objek mana yang akan menangani acara. Delegasi adalah tipe yang memegang referensi metode. Delegasi memiliki tanda tangan dan memegang referensi ke metode yang cocok dengan tanda tangannya sehingga Delegasi seperti pointer fungsi yang aman.

button1.Click + = System.EventHandler baru (button1_Click) System.EventHandler dinyatakan sebagai delegasi di sini. Dalam .net Events bekerja pada konsep Delegate (seperti Tombol Klik)

Delegasi digunakan ketika Anda tidak tahu kode mana yang harus dipanggil pada saat dijalankan Jadi pada saat itu Delegasi digunakan untuk menangani Acara

http://msdn.microsoft.com/en-us/library/ms173171(v=vs.80).aspx


1

Sebuah objek delegasi adalah obyek yang objek lain berkonsultasi ketika sesuatu terjadi dalam objek itu. Misalnya, petugas perbaikan Anda adalah delegasi Anda jika terjadi sesuatu pada mobil Anda. Anda pergi ke bengkel Anda dan memintanya untuk memperbaiki mobil untuk Anda (walaupun beberapa lebih suka memperbaiki mobil sendiri, dalam hal ini, mereka adalah delegasi mereka sendiri untuk mobil mereka).


1

Delegasi adalah objek yang mewakili pointer ke suatu fungsi. Namun, ini bukan penunjuk fungsi biasa karena:

1) Berorientasi Objek

2) Apakah aman, yaitu hanya dapat menunjuk ke suatu metode dan Anda tidak dapat membaca alamat memori mentah yang ditunjuknya

3) Sangat diketik. Itu hanya bisa menunjuk ke metode yang cocok dengan tanda tangannya.

4) Dapat menunjuk lebih dari satu metode pada saat yang bersamaan.


1

Delegasi terutama digunakan dengan acara.

Kebutuhannya adalah:

Anda tidak ingin mengeksekusi sepotong kode pada saat Anda menjalankan program. Setelah menjalankan program, Anda ingin menjalankan potongan kode itu setiap kali suatu peristiwa terjadi.

Contoh:

  1. Aplikasi konsol - kode hanya dapat dijalankan pada saat Anda menjalankan program. (Ditulis di dalam metode Utama)
  2. Aplikasi Windows (pemrograman antarmuka pengguna) - kode dapat dieksekusi ketika mengklik tombol setelah menjalankan program.

Inilah yang mereka katakan, Anda tidak tahu metode mana yang akan dipanggil pada waktu kompilasi. Anda tahu itu hanya saat runtime saat mengklik tombol.

Tanpa delegasi, pemrograman antarmuka pengguna tidak dimungkinkan. Karena Anda mengeksekusi kode setiap kali pengguna membuat acara yang mengklik tombol, mengetik di kotak teks, memilih item dropdownlist dan seterusnya ....


0

Delegasi adalah sesuatu yang tugasnya didelegasikan. Tujuan utama delegasi adalah untuk memisahkan kode dan memungkinkan fleksibilitas dan penggunaan kembali yang lebih besar.

Dalam pemrograman, dan khususnya pemrograman berorientasi objek, ini berarti bahwa ketika suatu metode dipanggil untuk melakukan beberapa pekerjaan, ia meneruskan pekerjaan ke metode objek lain yang memiliki referensi untuk itu. Referensi dapat menunjuk ke objek apa pun yang kita inginkan, selama objek tersebut sesuai dengan serangkaian metode yang telah ditentukan. Kami menyebutnya "pemrograman ke antarmuka" (versus pemrograman ke implementasi kelas konkret). Antarmuka pada dasarnya adalah template umum dan tidak memiliki implementasi; itu hanya berarti resep, seperangkat metode, prasyarat dan postkondisi (aturan).

Contoh sederhana:

SomeInterface
{
   public void doSomething();
}


SomeImplementation implements SomeInterface
{
   public void doSomething()
   {
      System.err.println("Was it good for you?");
   }

}


SomeCaller
{
   public void doIt(SomeInterface someInterface)
   {
      someInterface.doSomething();
   }
}

Sekarang Anda lihat saya dapat menggunakan implementasi apa pun yang saya inginkan kapan saja tanpa mengubah kode di SomeCaller karena jenis yang doIt()dilewatkan tidak konkret melainkan abstrak karena merupakan antarmuka. Di dunia Java, ini sering dinyatakan dalam paradigma layanan tempat Anda memanggil layanan (objek yang mengiklankan dirinya sebagai layanan melalui antarmuka tertentu) dan layanan kemudian memanggil delegasi untuk membantunya melakukan tugasnya. Metode layanan ini dinamai tugas kasar (makePayment (), createNewUser (), dll.), Sementara secara internal banyak melakukan hal-hal sepele jika bekerja melalui delegasi, dengan tipe delegasi yang menjadi antarmuka alih-alih implementasi konkret.

SomeService
{
    SomeInterface someImplementation = ... // assign here
    SomeOtherInterface someOtherImplementation = ... // okay, let's add a second

    public void doSomeWork()
    {
         someImplementation.doSomething();
         someOtherImplementation.doSomethingElse();
    }
}

(NB: Bagaimana implementasi ditugaskan di luar lingkup utas ini. Pencarian inversi kontrol dan injeksi ketergantungan.)


-2

Meskipun bukan "penunjuk fungsi" yang sebenarnya, delegasi mungkin terlihat seperti ini adalah bahasa yang dinamis seperti PHP:



$func = 'foo';
$func();

function foo() {
    print 'foo';
}

atau dalam JavaScript Anda dapat melakukan sesuatu seperti:


var func = function(){ alert('foo!'); }
func();


2
Ini bukan contoh delegasi. Dalam contoh Anda, Anda menggunakan apa yang disebut fungsi variabel yang pada dasarnya mencari fungsi yang memiliki nama yang sama dengan string yang dirujuk variabel. Lihat fungsi variabel: php.net/manual/en/functions.variable-functions.php
Aquarelle
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.