Delegates

         დელეგატი არი სპეციალური ტიპის ობიექტი რომელიც შეიცავს მიმართვას            (ცნობას მეთოდზე). დელეგატი გამოიძახება ისე რომ, თითქოს ის იყოს სხვა რომელიმე მეთოდი. მიუხედავად ამისა მისი გამოძახების დროს სრულდება მის დაქვემდებარებაში მყოფი მეთოდი.  მარტივი დონის აბსტრაქციის გამო, მეთოდზე არაპირდაპირი მიმართვა მოხერხებულია რადგან პროგრამის წერის დროს არ გვაინტერესებს თუ კონკრეტულად რა მეთოდია. მიმრთვა იქმნება რანთაიმის
დროს და შეიძლება შეიცვალოს პროგრამის მსვლელობისას. ანუ მარტივად რომ ვთქვათ დელეგატი საშუალებას გვაძლევს კლასის შიგნით შევიტანოთ ფუნქცია,
ისე რომ თვითონ კლასს არ შევეხოთ.                                                                                 გასათვალისწინებელია ისიც, რომ თავისთავად დელეგატი წარმოადგენს კლასს.

                                         Multicasting                                                                                             დელეგატებს შემოაქვთ მნიშვნელოვანი ცნება ე.წ.   Multicasting–ი. როდესაც დელეგატი გამოყენებულია Multicasting–ისთვის, ამ  დროს დელეგატში შეიძლება ჩადებული იყოს  ორ ან მეტ მეთოდზე მიმართვა. ამ შემთხვევაში დელეგატის მხოლოდ ერთხელ
გამოძახება იწვევს, მასზე მიბმული ყველა მეთოდის გამოძახებას. წევრებზე მიმართვის
მოცემულ კომბინაცია ცნობილია ეგრერდწოდებული მიბმული (დაკავშირებული) ჯაჭვის სახელით.

განვიხილოთ დელეგატები მაგალითის დახმარებით, პირველ შემთხვევაში ფუნქციას მივაბავთ დელეგატს  და შევიტანთ კლასის შიგნით, ხოლო გარედან დელეგატის გამოძახებით მივმართავთ ფუნქციას.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Delegates_Example {
  class Program {
    static void Main(string[] args) {
      DLGT_Class a = new DLGT_Class();
      Method0Handler h = new Method0Handler(MethExample0);
      //მოცემული მეთოდით h დელეგატს ვაბავთ MethExample0
      //ფუნქციას
      h(); //დელეგატის გამოძახება
      double[] arr = { 1, 2, 3 };
      a.anyMethod1 = MethExample1;
      //MethExample1 ფუნქციის მიბმა დელეგატზე ასე
      //მარტივადაც შეიძლება
      a.MethodForDelegates(arr, Square);
      //მივმართავთ DLGT_Class კლასის ფუნქციას რომელიც
      //იყენებს anyMethod1 და arrayTransform დელეგატებს,
      //თავისმხრივ arrayTransform დელეგატთან მიბმულია
      //Square ფუნქცია

      for(int i = 0; i < arr.Length; i++) {
        Console.WriteLine(arr[i]);
      }
      Console.Read();
    }

    static void MethExample0() {
      for(int i = 0; i < 10; i++) {
        Console.Write(i + "; ");
      }
      Console.WriteLine("\n");
    }

    static int MethExample1(int a, int b) {
      return a + b;
    }

    static double Square(double l) {
      return l * l;
    }

  }
}

* This source code was highlighted with Source Code Highlighter.

====================================================================
lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
====================================================================

using System;

namespace Delegates_Example {

  delegate void Method0Handler();
  /*დელეგატის გამოცხადება ხდება ისევე როგორც ფუნქციის
  იმ განსხვავებით რომ მას ტანი არა აქვს
  გასათვალისწინებელია ის რომ, დელეგატი კლასია)
  ხოლო დასაბრუნებელი და გადასაცემი პარამეტრის ტიპი
  მიეთითება იმ ფუნქციის შესაბამისად რომლის მიბმაც
  ხდება მასზე.*/
  delegate int Method1Handler(int a, int b);
  delegate double Transformer(double w);

  class DLGT_Class {
    public Method0Handler anyMethod0;
    public Method1Handler anyMethod1;
    /*დელეგატზე მანიპულირებისთვის კლასის შიგნით
     შემოგვაქვს დელეგატის ტიპის პარამეტრები
     რომელთანაც მიბმული იქნება ფუნქციები?*/

    public void MethodForDelegates(double[] value, Transformer arrayTransform) {
      if(anyMethod1 != null) {/*იმ შემთხვევაში თუ
        დელეგატს ფუნცია არ გადაცემა, მაშინ არაფერი შესრულდება*/
        Console.WriteLine(" into " + "Method1Handler");
        Console.WriteLine(anyMethod1(2, 5) + "\n=========");
        /*დელეგატს გადაეწოდება ორი პარამეტრი
        და შესაბამისად მასზე მიბმულ ფუნქციასაც*/
      }
      if(arrayTransform != null) {
        Console.WriteLine(" into " + "Method2Handler");
        for(int i = 0; i < value.Length; i++) {
          value[i] = arrayTransform(value[i]);
        }
      }
    }

  }
}

* This source code was highlighted with Source Code Highlighter.

Advertisements
This entry was posted in C# Programming. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s