আজকে আমরা মাল্টিক্যাস্ট ডেলিগেট নিয়ে আলোচনা করবো ।। ধরো আমরা একটা ডেলিগেট দিয়ে - এক এর অধিক ফাংশনকে পয়েন্ট করবো ।।
চলো আমরা সিম্পল একটা সমস্যা দেখে আসি ---------------------------------------------
using System;
using System.Collections.Generic;
public delegate void SampleDelegate();
class Program
{
public static void Main(string[] args)
{
SampleDelegate d1, d2, d3, d4;
d1 = new SampleDelegate(method1);
d2 = new SampleDelegate(method2);
d3 = new SampleDelegate(method3);
d4 = d1 + d2 + d3;
d4();
Console.ReadKey();
}
public static void method1()
{
Console.WriteLine("It Is Method No.1");
}
public static void method2()
{
Console.WriteLine("It is Method No.2");
}
public static void method3()
{
Console.WriteLine("It is Method No.3");
}
}
এখানে আমরা SampleDelegate নামে যে ডেলিগেট ক্রিয়েট করেছি , সেটা - তিনটা মেথোড/ফাংশনকে পয়েন্ট করছে ।। আমরা ,SampleDelegate এর জন্য মোট ৪ টা রেফারেন্স ভ্যারিয়েবল ক্রিয়েট করেছি ।। তারপর , আমরা SampleDelegate নামের ডেলিগেট-এর তিন তিনটা কন্সট্রাক্টরে , আমাদের তিন তিনটা মেথোডের নাম উল্লেখ করে দিয়েছি ।। এরপর , + অপারেটরের মাধ্যমে তিনটাই একসাথে করে , d4 তে অ্যাসাইন করে দিয়েছি ,এর মানে - d4 এর মাধ্যমে আমরা তিনটা মেথোডকেই পয়েন্ট করছি ।। আর তারপর তো , d4() এর মাধ্যমে তিনটা আউটপুটই দেখাচ্ছি ।। একটা জিনিস খেয়াল রাখা উচিত , আমরা যেভাবে - যে সিরিয়ালে, d4 এ অ্যাসাইন করবো , সেই অনুযায়ি আউটপুট দেখতে পাবো ।। আমি যদি , d4= d1 + d3 + d2 ; এভাবে লিখতাম তাহলে তুমি মেথোড-১ এর পর মেথোড-৩ আগে দেখতে , তারপর মেথোড-২ ।।
এখন ধরো , তুমি -- মেথোড-২ প্রিন্ট করবে না , তাহলে তুমি কিন্তু d4=d1+d2+d3-d2 ; এভাবে লিখতে পারো ।। আবার , d4 = d1 + d3 ; এভাবেও লিখতে পারো ।। তোমার ইচ্ছে !!
আবার , তুমি তিনটি মেথোডকেই কল করার জন্য ,আরো একটা উপায় ইউজ করতে পারো , সেটা হলো -----------
SampleDelegate d;
d = new SampleDelegate(method1);
d =d+ method2 + method3;
d();
এর মানে , তুমি মেথোড-১ এর জন্য যে ডেলিগেট আছে , তার সাথেই - বাকি দুটি মেথোড এর রেজিস্ট্রার করানো ।। আবার তুমি , যদি যে কোনো দুইটি মেথোড রান করাতে চাও , তাহলে এভাবেও করতে পারবে ---------
SampleDelegate d;
d = new SampleDelegate(method1);
d += method3;
d();
আচ্ছা ধরো , আমরা তো শুধু ভয়েড টাইপ নিয়েই কাজ করলাম । এখন যদি ফাংশনগুলি ---যদি ভয়েড ছাড়াও অন্যকিছু রিটার্ন করে , তাহলে কি হবে ?? তখন কোনটার'টা আসলে প্রিন্ট হবে ?? চলো দেখে আসি --
using System;
using System.Collections.Generic;
public delegate int SampleDelegate();
class Program
{
public static void Main(string[] args)
{
SampleDelegate d;
d = new SampleDelegate(method1);
d += method3;
d += method2;
int DelegateReturnValue = d();
Console.WriteLine(DelegateReturnValue);
Console.ReadKey();
}
public static int method1()
{
return 1;
}
public static int method2()
{
return 2;
}
public static int method3()
{
return 3;
}
}
আচ্ছা , তাহলে -- আমরা তিনটা মেথোডই রেজিস্ট্রার করালাম , প্রথমটার সাথে , এখন দেখি আউটপুট-এ কোনটা'র টা দেখায় ?? রান করে দেখে নাও । হুম , সবসময়ই -- সবশেষে , যেটা অ্যাসাইন করবে সেটারই ভ্যালু দেখাবে , বিষয়টা খুব ভালো করে মাথায় রেখো ।। আউটপুট প্যারামিটারের ক্ষেত্রেও একই রকম ব্যপার হবে , বিষয়টি ,মনে রেখো ----------------
using System;
using System.Collections.Generic;
public delegate void SampleDelegate(out int n);
class Program
{
public static void Main(string[] args)
{
SampleDelegate d;
d = new SampleDelegate(method1);
d += method2;
int DelegateReturnValue = -1;
d(out DelegateReturnValue);
Console.WriteLine(DelegateReturnValue);
Console.ReadKey();
}
public static void method1(out int n)
{
n= 1;
}
public static void method2(out int n)
{
n= 2;
}
}
তো যা হোক , এইটুকুই । ডেলিগেট নিয়ে আরো কথা হবে -- পরে ডিতেইলস-এ ।। আপাতত এইটুকুই -----------------------
চলো আমরা সিম্পল একটা সমস্যা দেখে আসি ---------------------------------------------
using System;
using System.Collections.Generic;
public delegate void SampleDelegate();
class Program
{
public static void Main(string[] args)
{
SampleDelegate d1, d2, d3, d4;
d1 = new SampleDelegate(method1);
d2 = new SampleDelegate(method2);
d3 = new SampleDelegate(method3);
d4 = d1 + d2 + d3;
d4();
Console.ReadKey();
}
public static void method1()
{
Console.WriteLine("It Is Method No.1");
}
public static void method2()
{
Console.WriteLine("It is Method No.2");
}
public static void method3()
{
Console.WriteLine("It is Method No.3");
}
}
এখানে আমরা SampleDelegate নামে যে ডেলিগেট ক্রিয়েট করেছি , সেটা - তিনটা মেথোড/ফাংশনকে পয়েন্ট করছে ।। আমরা ,SampleDelegate এর জন্য মোট ৪ টা রেফারেন্স ভ্যারিয়েবল ক্রিয়েট করেছি ।। তারপর , আমরা SampleDelegate নামের ডেলিগেট-এর তিন তিনটা কন্সট্রাক্টরে , আমাদের তিন তিনটা মেথোডের নাম উল্লেখ করে দিয়েছি ।। এরপর , + অপারেটরের মাধ্যমে তিনটাই একসাথে করে , d4 তে অ্যাসাইন করে দিয়েছি ,এর মানে - d4 এর মাধ্যমে আমরা তিনটা মেথোডকেই পয়েন্ট করছি ।। আর তারপর তো , d4() এর মাধ্যমে তিনটা আউটপুটই দেখাচ্ছি ।। একটা জিনিস খেয়াল রাখা উচিত , আমরা যেভাবে - যে সিরিয়ালে, d4 এ অ্যাসাইন করবো , সেই অনুযায়ি আউটপুট দেখতে পাবো ।। আমি যদি , d4= d1 + d3 + d2 ; এভাবে লিখতাম তাহলে তুমি মেথোড-১ এর পর মেথোড-৩ আগে দেখতে , তারপর মেথোড-২ ।।
এখন ধরো , তুমি -- মেথোড-২ প্রিন্ট করবে না , তাহলে তুমি কিন্তু d4=d1+d2+d3-d2 ; এভাবে লিখতে পারো ।। আবার , d4 = d1 + d3 ; এভাবেও লিখতে পারো ।। তোমার ইচ্ছে !!
আবার , তুমি তিনটি মেথোডকেই কল করার জন্য ,আরো একটা উপায় ইউজ করতে পারো , সেটা হলো -----------
SampleDelegate d;
d = new SampleDelegate(method1);
d =d+ method2 + method3;
d();
এর মানে , তুমি মেথোড-১ এর জন্য যে ডেলিগেট আছে , তার সাথেই - বাকি দুটি মেথোড এর রেজিস্ট্রার করানো ।। আবার তুমি , যদি যে কোনো দুইটি মেথোড রান করাতে চাও , তাহলে এভাবেও করতে পারবে ---------
SampleDelegate d;
d = new SampleDelegate(method1);
d += method3;
d();
আচ্ছা ধরো , আমরা তো শুধু ভয়েড টাইপ নিয়েই কাজ করলাম । এখন যদি ফাংশনগুলি ---যদি ভয়েড ছাড়াও অন্যকিছু রিটার্ন করে , তাহলে কি হবে ?? তখন কোনটার'টা আসলে প্রিন্ট হবে ?? চলো দেখে আসি --
using System;
using System.Collections.Generic;
public delegate int SampleDelegate();
class Program
{
public static void Main(string[] args)
{
SampleDelegate d;
d = new SampleDelegate(method1);
d += method3;
d += method2;
int DelegateReturnValue = d();
Console.WriteLine(DelegateReturnValue);
Console.ReadKey();
}
public static int method1()
{
return 1;
}
public static int method2()
{
return 2;
}
public static int method3()
{
return 3;
}
}
আচ্ছা , তাহলে -- আমরা তিনটা মেথোডই রেজিস্ট্রার করালাম , প্রথমটার সাথে , এখন দেখি আউটপুট-এ কোনটা'র টা দেখায় ?? রান করে দেখে নাও । হুম , সবসময়ই -- সবশেষে , যেটা অ্যাসাইন করবে সেটারই ভ্যালু দেখাবে , বিষয়টা খুব ভালো করে মাথায় রেখো ।। আউটপুট প্যারামিটারের ক্ষেত্রেও একই রকম ব্যপার হবে , বিষয়টি ,মনে রেখো ----------------
using System;
using System.Collections.Generic;
public delegate void SampleDelegate(out int n);
class Program
{
public static void Main(string[] args)
{
SampleDelegate d;
d = new SampleDelegate(method1);
d += method2;
int DelegateReturnValue = -1;
d(out DelegateReturnValue);
Console.WriteLine(DelegateReturnValue);
Console.ReadKey();
}
public static void method1(out int n)
{
n= 1;
}
public static void method2(out int n)
{
n= 2;
}
}
তো যা হোক , এইটুকুই । ডেলিগেট নিয়ে আরো কথা হবে -- পরে ডিতেইলস-এ ।। আপাতত এইটুকুই -----------------------
No comments:
Post a Comment