সি # দুটি পদ জানে, delegate
এবং event
। প্রথমটি দিয়ে শুরু করা যাক।
প্রতিনিধি
ক delegate
একটি পদ্ধতির রেফারেন্স। আপনি যেমন একটি উদাহরণের জন্য একটি রেফারেন্স তৈরি করতে পারেন ঠিক তেমন:
MyClass instance = myFactory.GetInstance();
কোনও পদ্ধতির রেফারেন্স তৈরি করতে আপনি প্রতিনিধি ব্যবহার করতে পারেন:
Action myMethod = myFactory.GetInstance;
এখন আপনার কাছে কোনও পদ্ধতির এই রেফারেন্স রয়েছে, আপনি রেফারেন্সের মাধ্যমে পদ্ধতিটি কল করতে পারেন:
MyClass instance = myMethod();
তবে কেন করবে? আপনি কেবল myFactory.GetInstance()
সরাসরি কল করতে পারেন । এই ক্ষেত্রে আপনি পারেন। তবে, আপনি অন্যান্য অ্যাপ্লিকেশনটির জ্ঞান থাকতে myFactory
বা কল করতে চান না এমন জায়গাগুলি ভাবার অনেকগুলি বিষয় রয়েছেmyFactory.GetInstance()
সরাসরি ।
একটি সুস্পষ্ট এক যদি আপনি প্রতিস্থাপন পাবে চাই myFactory.GetInstance()
মধ্যে myOfflineFakeFactory.GetInstance()
একটি কেন্দ্রীয় জায়গা (ওরফে থেকে কারখানা পদ্ধতি প্যাটার্ন )।
কারখানার পদ্ধতি প্যাটার্ন
সুতরাং, যদি আপনার কোনও TheOtherClass
ক্লাস থাকে এবং এটির ব্যবহারের প্রয়োজন হয় তবে myFactory.GetInstance()
এইভাবে কোডটি প্রতিনিধিদের ছাড়াই দেখতে হবে (আপনাকে আপনার TheOtherClass
ধরণের সম্পর্কে জানাতে হবে myFactory
):
TheOtherClass toc;
//...
toc.SetFactory(myFactory);
class TheOtherClass
{
public void SetFactory(MyFactory factory)
{
// set here
}
}
আপনি যদি প্রতিনিধিদের ব্যবহার করতে চান তবে আমার কারখানার ধরণটি আপনাকে প্রকাশ করতে হবে না:
TheOtherClass toc;
//...
Action factoryMethod = myFactory.GetInstance;
toc.SetFactoryMethod(factoryMethod);
class TheOtherClass
{
public void SetFactoryMethod(Action factoryMethod)
{
// set here
}
}
সুতরাং, আপনি কোনও প্রকারের প্রতিনিধি তাদের প্রকারটি তাদের কাছে প্রকাশ না করেই ব্যবহার করতে পারেন। আপনি যে বিষয়টি প্রকাশ করছেন তা হ'ল আপনার পদ্ধতির স্বাক্ষর (আপনার কতগুলি পরামিতি রয়েছে এবং যেমন।)
"আমার পদ্ধতির স্বাক্ষর", এর আগে কোথায় শুনলাম? ও হ্যাঁ, ইন্টারফেস !!! ইন্টারফেস একটি সম্পূর্ণ শ্রেণীর স্বাক্ষর বর্ণনা করে। প্রতিনিধিদের কেবল একটি পদ্ধতির স্বাক্ষরের বর্ণনা হিসাবে চিন্তা করুন!
একটি ইন্টারফেস এবং একটি প্রতিনিধি মধ্যে অন্য একটি বড় পার্থক্য হ'ল আপনি যখন আপনার ক্লাসটি লিখছেন, তখন আপনাকে সি # "বলতে হবে না এই পদ্ধতিটি সেই ধরণের প্রতিনিধিকে প্রয়োগ করে"। ইন্টারফেসের সাথে, আপনাকে "এই শ্রেণিটি সেই ধরণের একটি ইন্টারফেস প্রয়োগ করে" বলতে হবে।
আরও, একটি প্রতিনিধি রেফারেন্স (কিছু সীমাবদ্ধতা সহ, নীচে দেখুন) একাধিক পদ্ধতি (ডাকা MulticastDelegate
) উল্লেখ করতে পারে । এর অর্থ হ'ল আপনি যখন প্রতিনিধিকে কল করবেন তখন একাধিক সুস্পষ্টভাবে সংযুক্ত পদ্ধতি কার্যকর করা হবে। একটি অবজেক্ট রেফারেন্স সর্বদা কেবল একটি বস্তুর রেফারেন্স করতে পারে।
একটি জন্য বিধিনিষেধ MulticastDelegate
যে (পদ্ধতি / প্রতিনিধি) স্বাক্ষর কোন রিটার্ন মান (থাকা উচিত নয় হয় void
) এবং কীওয়ার্ড out
এবং ref
স্বাক্ষর ব্যবহার করা হয় না। স্পষ্টতই, আপনি দুটি পদ্ধতি কল করতে পারবেন না যা একটি নম্বর ফেরত দেয় এবং একই নম্বরটি প্রত্যাবর্তনের আশা করে। স্বাক্ষরটি মেনে চললে প্রতিনিধি স্বয়ংক্রিয়ভাবে ক MulticastDelegate
।
ঘটনা
ইভেন্টগুলি হ'ল বৈশিষ্ট্য (যেমন; get; সেট; বৈশিষ্ট্যগুলিতে ক্ষেত্রগুলিতে) যা অন্যান্য বস্তু থেকে প্রতিনিধিটির সাবস্ক্রিপশন প্রকাশ করে। এই বৈশিষ্ট্যগুলি, তবে, সেটকে সমর্থন করে না; পরিবর্তে, তারা অ্যাড সমর্থন; অপসারণ;
সুতরাং আপনি থাকতে পারেন:
Action myField;
public event Action MyProperty
{
add { myField += value; }
remove { myField -= value; }
}
ইউআইতে ব্যবহার (উইনফোর্ডস, ডাব্লুপিএফ, ইউডাব্লুপি তাই)
সুতরাং, এখন আমরা জানি যে একটি প্রতিনিধি কোনও পদ্ধতির একটি রেফারেন্স এবং বিশ্বকে জানাতে আমাদের কোনও অনুষ্ঠান হতে পারে যে তারা আমাদের প্রতিনিধিদের কাছ থেকে রেফারেন্স করার জন্য তাদের পদ্ধতিগুলি আমাদের দিতে পারে, এবং আমরা একটি ইউআই বোতাম, তারপরে: আমরা আমাকে ক্লিক করা হয়েছে কিনা সে বিষয়ে আগ্রহী যে কেউ, তাদের সাথে আমাদের পদ্ধতিটি নিবন্ধিত করতে (আমাদের সামনে প্রকাশিত ইভেন্টের মাধ্যমে) জিজ্ঞাসা করতে পারে। আমাদের প্রদত্ত সেই সমস্ত পদ্ধতিগুলি আমরা ব্যবহার করতে পারি এবং আমাদের প্রতিনিধি দ্বারা সেগুলি উল্লেখ করতে পারি। এবং তারপরে, আমরা অপেক্ষা করব এবং অপেক্ষা করব .... যতক্ষণ না কোনও ব্যবহারকারী এসে সেই বোতামটিতে ক্লিক না করে, তারপরে আমাদের প্রতিনিধিটিকে আহ্বান করার যথেষ্ট কারণ থাকবে। এবং প্রতিনিধি আমাদের প্রদত্ত সেই সমস্ত পদ্ধতিগুলির উল্লেখ করে, সেই সমস্ত পদ্ধতিতে আমন্ত্রণ জানানো হবে। আমরা জানি না যে এই পদ্ধতিগুলি কী করে, বা আমরা জানি না কোন শ্রেণীটি সেগুলি প্রয়োগ করে। আমরা কেবল যত্ন করি তা হ'ল কেউ আমাদের ক্লিক করতে আগ্রহী ছিল,
জাভা
জাভার মতো ভাষায় প্রতিনিধি নেই have পরিবর্তে তারা ইন্টারফেস ব্যবহার করে। তারা যেভাবে তা করে তা হ'ল 'আমাদের ক্লিক করা হচ্ছে' এমন আগ্রহী যে কাউকে জিজ্ঞাসা করা, একটি নির্দিষ্ট ইন্টারফেস (একটি নির্দিষ্ট পদ্ধতি যা আমরা কল করতে পারি) প্রয়োগ করতে, তারপরে আমাদের পুরো উদাহরণটি দেয় যা ইন্টারফেসটি কার্যকর করে। আমরা এই ইন্টারফেসটি প্রয়োগকারী সমস্ত বস্তুর একটি তালিকা রাখি এবং যখনই আমরা ক্লিক করি তখন তাদের 'নির্দিষ্ট পদ্ধতিতে আমরা কল করতে পারি' কল করতে পারি।