Delege nedir? [kapalı]


152

Bir delegenin asıl rolü nedir?

Bu soruya röportajlarımda birçok kez soru soruldu, ancak görüşmecilerin cevabımdan memnun olduklarını düşünmüyorum.

Biri bana en iyi tanımı, tek bir cümleyle, pratik bir örnekle söyleyebilir mi?


21
merakla, size nasıl düzeltebileceğinizi söyleyebilmemiz için ne yanıt verdiniz?
Anthony Forloney

6
Bu sorunun kapatıldığını ancak 126 upvotes olduğunu ve 65 kişinin favori olarak işaretlediğini ilginç buluyorum. Çok geniş olsa bile hala çok iyi bir soru gibi görünüyor.
Zengin

Yanıtlar:


171

Bir delegeyi "bir işleve işaretçi" olarak düşünmeyi seviyorum. Bu C günlerine kadar gidiyor, ama fikir hala geçerli.

Fikir, bir kod parçasını çağırabilmeniz gerektiğidir, ancak çağıracağınız kod parçası çalışma zamanına kadar bilinmemektedir. Yani bu amaçla bir "delege" kullanıyorsunuz. Delegeler, olay işleyicileri ve örneğin farklı olaylara dayalı farklı şeyler yaptığınız işler için kullanışlıdır.

İşte size bakabileceğiniz C # için bir referans:

Örneğin, C # 'da diyelim ki yapmak istediğimiz bir hesaplama yaptık ve çalışma zamanına kadar bilmediğimiz farklı bir hesaplama yöntemi kullanmak istedik. Dolayısıyla, bunun gibi birkaç hesaplama yöntemimiz olabilir:

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

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

Bunun gibi bir temsilci imzası beyan edebiliriz:

public delegate double calcTotalDelegate(double amt);

Ve sonra delegeyi böyle bir parametre olarak alan bir yöntem beyan edebiliriz:

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

Ve CalcMyTotalkullanmak istediğimiz delege yönteminden geçen yöntemi çağırabiliriz .

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

19
C. basit ama etkili bir işlev işaretçisine nod +1
Aiden Bell

3
Cevabınızla ilgili bir soru. Bir işlevi normal şekilde çağırmaktan gerçekten farkı nedir? Sadece çalışma zamanında bilinmediği için?
Naveed

1
@NAVEED - son düzenlememe bakın, bir örnek ekledim. Gerçek yöntem çağrısına gelince, yukarıdaki örneğimdeki normal bir yöntem çağrısından farklı görünmüyor (calcTotal (amt) delege çağırıyor), ancak delegelerin gücü bunları parametre olarak kullanabilmeniz, bir yöntemin farklı davranışlara sahip olmasını istediğinizde. Onları da kullanabileceğiniz birçok şey var, bu sadece basit bir örnek. Umarım yardımcı olur.
dcp

Çalışma zamanında bilinmemektedir ve serbest bir işlevden ziyade bağlı bir işlevdir - Foobir temsilciye statik olmayan bir yöntem atamak this.Foo(), işlev işaretçisinin yaptığı gibi statik bir işlev yerine çağırır (C'de, genellikle ek bir void*parametreniz vardır. geçmesi this) işlevi işaretçi
Pete Kirkham

1
C / C ++ 'da işlev işaretçileriyle benzerlikler oluşturan hızlı ve etkili örnek için +1. Çok takdir!
G21

19

bir temsilci basitçe bir işlev işaretleyicisidir.
sadece temsilcinizi çalıştırmak istediğiniz yöntemi atayın. daha sonra kodda Invoke ile bu yöntemi çağırabilirsiniz.

göstermek için bazı kodlar (sözdizimi kapalı olabilmesi için bunu bellekten yazdı)

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

Buradan alındı

S Delege nedir?
A Bir nesne bir istek aldığında, nesne ya isteğin kendisini işleyebilir ya da işi yapmak için isteği ikinci bir nesneye iletebilir. Nesne isteği iletmeye karar verirse, nesnenin isteği ikinci nesneye işleme sorumluluğunu ilettiğini söylersiniz.

Ya da, kolay bir sahte örnek olarak: bir şey object1'e bir istek gönderir. object1 daha sonra isteği ve kendisini delege olan object2'ye iletir. object2 isteği işler ve bazı işler yapar. (not: yukarıdaki bağlantı iyi örnekler verir)


Yukarıdaki bağlantıda verilen örnekte temsilci seçme doğru değildir.
Hardik9850


4

Temsilci, bir yönteme başvurabilen bir nesnedir. Böylece, bir temsilci oluşturduğumuzda, bir yönteme başvuru yapabilen bir nesne yaratırız. Ayrıca, yöntem bu referans ile çağrılabilir. Böylece, bir delege, başvurduğu yöntemi çağırabilir. Temsilcinin temel avantajı, bir yönteme çağrı belirlememize izin vermesidir, ancak gerçekte çağrılan yöntem derleme zamanında değil, çalışma zamanında belirlenir.

Basit Delege

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

Burada delegeleri, çok noktaya yayın delegelerini ve bunların kullanımını açıklayacağım. Delege, bir nesnede yöntem (ler) başvurusunu tutan bir türdür. Ayrıca, bir tür güvenli işlev işaretçisi olarak da adlandırılır. Bir temsilci, yöntem imzasını tanımlayan bir türdür diyebiliriz.

Bir temsilci başlatırken, örneğini uyumlu bir imzayla herhangi bir yöntemle ilişkilendirebilirsiniz. Temsilci örneği aracılığıyla yöntemi çağırabilirsiniz (veya çağırabilirsiniz). Delegeler, yöntemleri diğer yöntemlere argüman olarak iletmek için kullanılır. Olay işleyicileri, temsilciler aracılığıyla çağrılan yöntemlerden başka bir şey değildir. Temsilcileri kullanmanın avantajları, yöntemin çağrıyı çağırın Kapsüllendirilmesi Temsilcinin etkili kullanımı, uygulamanın performansını eşzamansız olarak çağırmak için kullanılır. Delegelerin bazı özellikleri var

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.

genel temsilci type_of_delegate delegate_name () // Beyan

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.

Aşağıdaki örnekte bir temsilci işlemi gösterilmektedir:

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

Çok Noktaya Yayın Temsilcisi nedir?

Birden fazla yöntemin referansını tutan bir temsilci. Çok noktaya yayın delegeleri yalnızca geçersiz döndüren yöntemler içermelidir, aksi takdirde çalışma zamanı istisnası vardır.

 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
  }
}

Burada Temsilci + = operatörü kullanılarak eklenir ve - = operatörü kullanılarak kaldırılır.

Delege türleri, .NET Framework'teki Delegate sınıfından türetilir. Delege türleri mühürlenir - türetilemezler. Örneklendirilen temsilci bir nesne olduğundan, parametre olarak iletilebilir veya bir özelliğe atanabilir. Bu, bir yöntemin bir delegeyi parametre olarak kabul etmesine ve daha sonra bir süre için delege çağırmasına izin verir. Bu, eşzamansız geri arama olarak bilinir.


1

Temsilci deseninin büyük bir açıklaması ve pratik uygulaması Google Koleksiyonlar Yönlendirme Sınıflarında (ayrıca Dekoratör kalıbı) bulunabilir.


1

Olay iletişiminde, gönderen olayı hangi nesnenin işleyeceğini bilmez. Temsilci, yöntemin başvurusunu tutan türdür. Temsilcinin imzası vardır ve Temsilcisi tür güvenli işlev işaretçisine benzemesi için imzasıyla eşleşen yönteme başvurur.

button1.Click + = yeni System.EventHandler (button1_Click) System.EventHandler burada bir temsilci olarak bildirilir. Net Olaylarında Delege kavramı üzerinde çalışır (Düğme Tıklaması gibi)

Temsilci çalışma zamanında hangi kodu çağıracağınızı bilmediğinizde kullanılır. Dolayısıyla, o zaman Temsilci, Olayları işlemek için kullanılır

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


1

Bir temsilci nesnesi şey o nesnenin içinde meydana geldiğinde başka amacı danışır o bir nesnedir. Örneğin, arabanıza bir şey olursa tamirciniz sizin temsilcinizdir. tamircinize gidip ondan arabayı tamir etmesini istersiniz (bazıları arabayı kendileri tamir etmeyi tercih etse de, bu durumda arabaları için kendi delegeleri).


1

Temsilci, bir işlevin işaretçisini temsil eden bir nesnedir. Ancak, sıradan bir işlev işaretçisi değildir:

1) Nesneye Yönelik mi

2) Tür güvenli midir, yani yalnızca bir yönteme işaret edebilir ve işaret ettiği ham bellek adresini okuyamazsınız

3) kuvvetle yazılmıştır. Yalnızca imzalarıyla eşleşen yöntemlere işaret edebilir.

4) Aynı anda birden fazla yönteme işaret edebilir.


1

Delegeler çoğunlukla etkinliklerle kullanılır.

İhtiyaç:

Programı çalıştırdığınız sırada bir parça kod yürütmek istemezsiniz. Programı çalıştırdıktan sonra, bir olay meydana geldiğinde bu kod parçasını yürütmek istersiniz.

Misal :

  1. Konsol uygulaması - kod yalnızca programı çalıştırdığınızda çalıştırılabilir. (Ana yöntem içinde yazılmıştır)
  2. Windows uygulaması (kullanıcı arabirimi programlama) - program çalıştırıldıktan sonra düğmeye tıklandığında kod yürütülebilir.

Dedikleri bu, derleme sırasında hangi yöntemin çağrıldığını bilmiyorsunuz. sadece düğmeyi tıkladığınızda olan çalışma zamanında biliyorsunuz.

Delegeler olmadan kullanıcı arabirimi programlaması yapılamaz. Çünkü kullanıcı düğmeyi tıklatıp, metin kutusuna yazarak, açılır liste öğesini seçerek ve benzeri olayları gerçekleştirdiğinde kod yürütüyorsunuz.


0

Temsilci, görevin devredildiği bir şeydir. Delegasyonun temel amacı kodu ayırmak ve daha fazla esneklik ve yeniden kullanıma izin vermektir.

Programlamada ve özellikle nesne yönelimli programlamada, bu, bir yöntem bir iş yapmak için çağrıldığında, çalışmayı referans aldığı başka bir nesnenin yöntemine aktardığı anlamına gelir. Referans, nesne önceden tanımlanmış bir yöntem kümesine uyduğu sürece, istediğimiz her nesneye işaret edebilir. Biz buna "bir arayüze programlama" diyoruz (somut bir sınıf uygulamasına programlamaya karşı). Bir arayüz temel olarak genel bir şablondur ve uygulaması yoktur; sadece bir tarif, bir dizi yöntem, önkoşul ve sonşartlar (kurallar) anlamına gelir.

Basit örnek:

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

Gördüğünüz gibi, SomeCaller'deki kodu değiştirmeden istediğim herhangi bir uygulamayı her zaman kullanabileceğimi görüyorsunuz çünkü geçen tip doIt()somut değil, bir arayüz olduğundan soyut. Java dünyasında, bu genellikle bir hizmete (belirli bir arabirim aracılığıyla kendini hizmet olarak tanıtan bir nesne) çağrı yaptığınız hizmet paradigmasında ifade edilir ve hizmet daha sonra işini yapmasına yardımcı olmak için delegelere seslenir. Hizmetin yöntemleri, kaba taneli görevler (makePayment (), createNewUser (), vb.) Olarak adlandırılırken, delege yoluyla nitritli çalışma varsa delegelerin türleri somut uygulamalar yerine arayüzler olarak dahili olarak çok şey yapar.

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

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

(Not: Bir uygulamanın nasıl atandığı bu iş parçacığının kapsamı dışındadır. Arama denetiminin ve bağımlılık enjeksiyonunun ters çevrilmesi.)


-2

Gerçekten bir "işlev işaretçisi" olmasa da, bir temsilci PHP gibi dinamik bir dil gibi görünebilir:



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

function foo() {
    print 'foo';
}

veya JavaScript'te aşağıdakine benzer bir şey yapabilirsiniz:


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


2
Bu bir heyet örneği değil. Örneğinizde, temelde bir değişkenin başvurduğu dize ile aynı ada sahip bir işlevi arayan değişken işlevi olarak adlandırılanı kullanıyorsunuz. Değişken işlevlere bakın: php.net/manual/tr/functions.variable-functions.php
Aquarelle
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.