একটি ইন্টারফেস সি # তে প্রতিনিধি কীভাবে যুক্ত করবেন


91

আমার ক্লাসে আমার কিছু প্রতিনিধি থাকা দরকার।

আমি এই প্রতিনিধিদের সেট করতে আমাকে "স্মরণ করিয়ে দিতে" ইন্টারফেসটি ব্যবহার করতে চাই।

কিভাবে?

আমার ক্লাসটি এর মতো দেখাচ্ছে:

public class ClsPictures : myInterface
{
    // Implementing the IProcess interface
    public event UpdateStatusEventHandler UpdateStatusText;
    public delegate void UpdateStatusEventHandler(string Status);

    public event StartedEventHandler Started;
    public delegate void StartedEventHandler();
}

এই প্রতিনিধিদের জোর করার জন্য আমার একটি ইন্টারফেস দরকার:

public interface myInterface
{
   // ?????
}

উত্তর:


142

সেগুলি ডেলিগেটের ধরণ ঘোষণা করছে । তারা কোনও ইন্টারফেসের সাথে সম্পর্কিত নয়। এই প্রতিনিধি প্রকারগুলি ব্যবহার করে ইভেন্টগুলি ইন্টারফেসে থাকা ভাল তবে:

public delegate void UpdateStatusEventHandler(string status);
public delegate void StartedEventHandler();

public interface IMyInterface
{       
    event UpdateStatusEventHandler StatusUpdated;    
    event StartedEventHandler Started;
}

প্রয়োগটি প্রতিনিধি প্রকারটিকে (এবং হওয়া উচিত নয়) কোনও ইন্টারফেসে ব্যবহৃত অন্য যে কোনও ধরণের পুনরায় বিবরণ দেবে তার চেয়ে বেশি পুনরায় বিবরণ দেবে না।


এটি ঠিক আমার পক্ষে কাজ করছে না। আমি ইতিবাচক আমি এইভাবে সবকিছু করেছি এবং এখনও, আমার ইন্টারফেসের মধ্যে আমার হ্যান্ডলারটি সনাক্ত করা যায় না। ইন্টারফেস প্রয়োগ করে এমন আমার ক্লাসটি অভিযোগ করছে যে ক্লাসটি সিস্টেমের ইন্টারফেস রিটার্নের ধরণের সাথে মেলে না।
চকি

4
@ চাকি: আপনার মতো মনে হচ্ছে সমস্যাটি হ্রাস করা একটি সংক্ষিপ্ত তবে সম্পূর্ণ উদাহরণ সহ একটি নতুন প্রশ্ন জিজ্ঞাসা করা উচিত। আমি যে উত্তরটি দিয়েছি তা সত্যিই কাজ করে।
জন স্কিটি

4
আমি বুঝতে পারিনি যে প্রতিনিধিদের ক্লাসের মতো অ্যাক্সেসযোগ্যতার স্তর রয়েছে। আমি সবসময় ভেবেছিলাম যে তাদের একটি বর্গের মধ্যে আবদ্ধ করা দরকার।
পুরুষার্থ

7
@ পুরসার্থ: এটি অ্যাক্সেসযোগ্যতা নয় - এটি কেবল প্রতিনিধিদের ধরণের (শ্রেণি, বাস্তবে) ঠিক যতটা ইন্টারফেস ইত্যাদির বিষয়
জোন স্কীত

29

.NET 3.5 যেহেতু আপনি নিজের ধরণের ঘোষণার প্রয়োজন ছাড়াই সিস্টেম.অ্যাকশন প্রতিনিধিদেরও ব্যবহার করতে পারেন।

এটি নিম্নলিখিত ইন্টারফেসের ফলাফল করবে:

public interface myInterface
{       
   // Implementing the IProcess interface
   event Action<String> UpdateStatusText;

   event Action Started;
}

+1 আমি ক্রিয়া / ফানককে প্রচলিত প্রতিনিধি প্রকারের চেয়ে অনেক বেশি মার্জিত (এবং পঠনযোগ্য) বলে মনে করি এবং আপনি এগুলি আপনার ইন্টারফেসে সংজ্ঞায়িত করতে পারেন।
chrnola

4
এই উত্তরটি প্রশ্নের উত্তর দেয় না (কীভাবে মাইন্টারফেস বাস্তবায়ন করবেন)।
lharper71

10

প্রতিনিধিটিকে সম্পত্তি হিসাবে প্রকাশ করুন

public delegate void UpdateStatusEventHandler(string status);
public delegate void StartedEventHandler();

public interface IMyInterface
{       
    UpdateStatusEventHandler StatusUpdated {get; set;}    
    StartedEventHandler Started {get; set;}
}

7

জন স্কিটির উত্তরটি সঠিক, আমি কেবল একটি নোট যুক্ত করতে চাই।

ইন্টারফেসগুলি আপনাকে "করিয়ে দেওয়ার" বা আপনার ক্লাসে কী অন্তর্ভুক্ত করবেন তা "মনে করিয়ে দেওয়ার" জন্য নেই। ইন্টারফেসগুলি বিমূর্তির মাধ্যম, অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং এবং ডিজাইনের পদ্ধতিতে ব্যবহৃত হয়। আপনি আপনার প্রোগ্রামের অন্য কোথাও ইন্টারফেস হিসাবে কিছু কংক্রিট বর্গ উদাহরণ দেখতে না চাইলে সম্ভবত আপনার কোনও ইন্টারফেস ঘোষণার প্রয়োজন হবে না (বিমূর্তি)।

আপনি যদি আপনার প্রকল্পে কিছু কোডিং মান প্রয়োগ করতে চান তবে আপনি কোড বিশ্লেষণ সরঞ্জামগুলি ব্যবহার করতে চাইতে পারেন (যেমন ভিজ্যুয়াল স্টুডিওতে) - তারা এক্সটেনশনের অনুমতি দেয়, যাতে আপনি নিজের কোড বিশ্লেষণের নিয়ম যুক্ত করতে পারেন।

কোড বিশ্লেষণ ব্যবহার করে, যদি আপনি প্রতিনিধিদের যুক্ত করতে "ভুলে যান" (যদিও আমি এটি ভুলে যাওয়ার বিন্দুটি দেখতে পাচ্ছি না, যেমন ডেলিগেটটি ব্যবহার করা হচ্ছে না, এটির প্রয়োজন নেই) আপনি একটি সতর্কতা / ত্রুটি পাবেন।


4
আপনি ঠিক থাকতে পারেন, তবে এমন কিছু সময় আছে যখন আপনি কিছু অনুমান করেন যে ভাল ডকুমেন্টেশন দিয়েও কিছুক্ষণ পরে মনে রাখা শক্ত। আমি আমার কোডটি পুনরায় ব্যবহার করার চেষ্টা করি তবে কখনও কখনও আমি মনে করি না এটি মূলটি কী এবং এটি কী নয় (যখন এটি প্রতিনিধিদের কাছে আসে - বড় চিত্রটি দেখতে আমার পক্ষে কঠিন ...)
আসফ

1

আপনার মন্তব্যগুলির মধ্যে একটি ইভেন্ট হ্যান্ডলারের রিটার্নের ধরণের উল্লেখ করেছে। আপনি হ্যান্ডলারের ধরণের, বা ইভেন্ট থেকে ফিরে আসা ডেটা সম্পর্কে আরও বেশি উদ্বিগ্ন? যদি এটি পরবর্তী হয়, তবে এটি সাহায্য করতে পারে। যদি তা না হয় তবে এই সমাধানটি পর্যাপ্ত হবে না, তবে আপনি যা খুঁজছেন তা আপনাকে আরও কাছে পেতে সহায়তা করতে পারে।

আপনাকে যা করতে হবে তা হ'ল আপনার ইভেন্ট হ্যান্ডলারদের ইন্টারফেস এবং আপনার প্রয়োগ উভয় ক্ষেত্রে জেনেরিক ইভেন্ট হ্যান্ডলার হিসাবে ঘোষণা করা এবং আপনি রিটার্নের ফলাফলগুলি কাস্টমাইজ করতে পারেন।

আপনার কংক্রিট বর্গটি দেখতে এমন হবে:

public class ClsPictures : myInterface
{
    // Implementing the IProcess interface
    public event EventHandler<UpdateStatusEventArgs> UpdateStatusText;
    //no need for this anymore: public delegate void UpdateStatusEventHandler(string Status);

    public event EventHandler<StartedEventArgs> Started;
    //no need for this anymore: public delegate void StartedEventHandler();
}

আপনার ইন্টারফেসটি দেখতে এই রকম হবে:

public interface myInterface
{
   event EventHandler<StartedEventArgs> Started;
   event EventHandler<UpdateStatusEventArgs> UpdateStatusText;
}

এখন ইভেন্টের আরগগুলি আপনার ধরণগুলি ফিরিয়ে দিচ্ছে, আপনি যে কোনও হ্যান্ডলারের সংজ্ঞা দিয়েছিলেন তাতে আপনি সেগুলিকে হুক করতে পারেন।

রেফারেন্সের জন্য: https://msdn.microsoft.com/en-us/library/edzehd2t(v=vs.110).aspx


0

আপনার উত্পন্ন শ্রেণীর মধ্যে উত্তরাধিকারসূত্রে প্রাপ্ত ইন্টারফেসটি আপনাকে এতে ঘোষিত স্টাফটিকে সংজ্ঞায়িত করতে এবং লিঙ্ক আপ করতে আপনাকে স্মরণ করিয়ে দেবে।

তবে আপনি এটি স্পষ্টভাবে ব্যবহার করতে চাইতে পারেন এবং আপনাকে এখনও এটি কোনও বস্তুর সাথে সংযুক্ত করতে হবে।

উদাহরণস্বরূপ একটি বিপরীত নিয়ন্ত্রণের প্যাটার্ন ব্যবহার করে:

class Form1 : Form, IForm {
   public Form1() {
     Controls.Add(new Foo(this));
   }

   // Required to be defined here.
   void IForm.Button_OnClick(object sender, EventArgs e) {
     ...
     // Cast qualifier expression to 'IForm' assuming you added a property for StatusBar.
     //((IForm) this).StatusBar.Text = $"Button clicked: ({e.RowIndex}, {e.SubItem}, {e.Model})";
   }
 }

আপনি এরকম কিছু চেষ্টা করতে পারেন।

interface IForm {
  void Button_OnClick(object sender, EventArgs e);
}


class Foo : UserControl {
  private Button btn = new Button();

  public Foo(IForm ctx) {
     btn.Name = "MyButton";
     btn.ButtonClick += ctx.Button_OnClick;
     Controls.Add(btn);
  }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.