كيفية القيام بما يلي: قم بتطبيق واجهة الأحداث (البرمجة C# إرشادات)

An واجهة can declare an حدث. يوضح المثال التالي كيفية تنفيذ واجهة الأحداث في فئة. Basically the rules are the same كـ when you implement أي واجهة أسلوب أو خاصية.

إلى implement واجهة أحداث في a فئة

  • Declare the حدث في your فئة و then invoke it في the appropriate areas.

    namespace ImplementInterfaceEvents
    {
        public interface IDrawingObject
        {
            event EventHandler ShapeChanged;
        }
        public class MyEventArgs : EventArgs 
        {
            // class members
        }
        public class Shape : IDrawingObject
        {
            public event EventHandler ShapeChanged;
            void ChangeShape()
            {
                // Do something here before the event…
    
                OnShapeChanged(new MyEventArgs(/*arguments*/));
    
                // or do something here after the event. 
            }
            protected virtual void OnShapeChanged(MyEventArgs e)
            {
                if(ShapeChanged != null)
                {
                   ShapeChanged(this, e);
                }
            }
        }
    
    }
    

مثال

The following مثال shows how إلى مؤشر the أقل-عام situation في which your فئة inherits من الثاني أو المزيد الواجهات و each واجهة has an حدث مع the same اسم. في this situation, you must provide an explicit واجهة implementation for على الأقل واحد of the أحداث. عندما تقوم بكتابة تنفيذ واجهة صريح لحدث ما، يجب أيضا كتابة addو removeaccessors حدث. عادة يتم توفير هذه بواسطة المترجم، ولكن في هذه الحالة المحول البرمجي لا توفر لهم.

بواسطة توفير accessors الخاصة بك، يمكنك تحديد ما إذا كان يتم تمثيل الأحداث الثاني بواسطة نفس حدث في فئة، أو بواسطة أحداث مختلفة. على سبيل المثال، إذا كان يجب أن يظهر الأحداث في أوقات مختلفة طبقاً إلى مواصفات واجهة، يمكنك إقران كل حدث تنفيذ ما منفصلة في فئة. في المثال التالي، المشتركين بتحديد أي OnDrawالحدث سيتلقون ببث المرجع شكل إلى أما IShapeأو IDrawingObject.

namespace WrapTwoInterfaceEvents
{
    using System;

    public interface IDrawingObject
    {
        // Raise this event before drawing
        // the object.
        event EventHandler OnDraw;
    }
    public interface IShape
    {
        // Raise this event after drawing
        // the shape.
        event EventHandler OnDraw;
    }


    // Base class event publisher inherits two
    // interfaces, each with an OnDraw event
    public class Shape : IDrawingObject, IShape
    {
        // Create an event for each interface event
        event EventHandler PreDrawEvent;
        event EventHandler PostDrawEvent;

        object objectLock = new Object();

        // Explicit interface implementation required.
        // Associate IDrawingObject's event with
        // PreDrawEvent
        event EventHandler IDrawingObject.OnDraw
        {
            add
            {
                lock (objectLock)
                {
                    PreDrawEvent += value;
                }
            }
            remove
            {
                lock (objectLock)
                {
                    PreDrawEvent -= value;
                }
            }
        }
        // Explicit interface implementation required.
        // Associate IShape's event with
        // PostDrawEvent
        event EventHandler IShape.OnDraw
        {
            add
            {
                lock (objectLock)
                {
                    PostDrawEvent += value;
                }
            }
            remove
            {
                lock (objectLock)
                {
                    PostDrawEvent -= value;
                }
            }


        }

        // For the sake of simplicity this one method
        // implements both interfaces. 
        public void Draw()
        {
            // Raise IDrawingObject's event before the object is drawn.
            EventHandler handler = PreDrawEvent;
            if (handler != null)
            {
                handler(this, new EventArgs());
            }
            Console.WriteLine("Drawing a shape.");

            // RaiseIShape's event after the object is drawn.
            handler = PostDrawEvent;
            if (handler != null)
            {
                handler(this, new EventArgs());
            }
        }
    }
    public class Subscriber1
    {
        // References the shape object as an IDrawingObject
        public Subscriber1(Shape shape)
        {
            IDrawingObject d = (IDrawingObject)shape;
            d.OnDraw += new EventHandler(d_OnDraw);
        }

        void d_OnDraw(object sender, EventArgs e)
        {
            Console.WriteLine("Sub1 receives the IDrawingObject event.");
        }
    }
    // References the shape object as an IShape
    public class Subscriber2
    {
        public Subscriber2(Shape shape)
        {
            IShape d = (IShape)shape;
            d.OnDraw += new EventHandler(d_OnDraw);
        }

        void d_OnDraw(object sender, EventArgs e)
        {
            Console.WriteLine("Sub2 receives the IShape event.");
        }
    }


    public class Program
    {
        static void Main(string[] args)
        {
            Shape shape = new Shape();
            Subscriber1 sub = new Subscriber1(shape);
            Subscriber2 sub2 = new Subscriber2(shape);
            shape.Draw();

            // Keep the console window open in debug mode.
            System.Console.WriteLine("Press any key to exit.");
            System.Console.ReadKey();
        }
    }

}
/* Output:
    Sub1 receives the IDrawingObject event.
    Drawing a shape.
    Sub2 receives the IShape event.
*/

راجع أيضًا:

المهام

كيفية القيام بما يلي: رفع الفئات المشتقة في أحداث فئات القاعدة ( دليل برمجة C# )

المرجع

الأحداث (دليل البرمجة لـ #C)

التفويضات (دليل البرمجة لـ #C)

تنفيذ واجهة صريح (إرشادات برمجة C#)

المبادئ

دليل البرمجة لـ #C