如何从不同的课程中提出相同的事件?

时间:2016-10-03 06:01:08

标签: c# events delegates

我有一个包含许多类的类库。 任何这些类都应该能够在任何时间点向客户端发送消息(字符串)。我想要一个可以从许多类中提出的通用事件。我不希望每个班级都有单独的活动。

这样的事情:

public class GenericEvent
{
    // Here I have an event.   
}

public class LibClass1
{
    //Raise event here.
}

public class LibClass2
{
    //Raise event here
}

public class Client
{
  //Subscribe to the event here
}

这是正确的做法吗?如果是的话,如何实现?我查找的示例都为每个类都有一个单独的事件。

4 个答案:

答案 0 :(得分:2)

这取决于此事件和用例,但其中一个选项是使用继承:

public class GenericEvent
{
    // Here I have an event.
    protected void RaiseEvent();
}

public class LibClass1 : GenericEvent 
{
    public voidDoSomethingAndRaiseEvent()
    {
        // ...
        RaiseEvent();
    }
}

这就是INotifiPropertyChanged通常的实施方式。

如果继承是不可能的并且您正在使用聚合,LibClass1LibClass2应该充当GenericEvent的一些门面/装饰者:他们必须拥有自己的事件,它会重新定向调用GenericEvent的事件和方法(-s)来提升它:

public class GenericEvent
{
    public event EventHandler SomeEvent;
    // ...
}

public class LibClass1
{
    private readonly GenericEvent _ge;

    // ...

    public event EventHandler SomeEvent
    {
        add { _ge.SomeEvent += value; }
        remove { _ge.SomeEvent -= value; }
    }

    public void DoSomethingAndRaiseEvent()
    {
        // ...
        SomeEvent?.Invoke(this, EventArgs.Emtpy);
    }
}

答案 1 :(得分:1)

    public class MyEventArgs : EventArgs
    {
        // class members
    }

    public abstract class Lib
    {
        public event EventHandler ShapeChanged;

        public virtual void OnShapeChanged(MyEventArgs e)
        {
            if (ShapeChanged != null)
            {
                ShapeChanged(this, e);
            }
        }
    }

    public class LibClass1 : Lib
    {
        //Raise event here.
    }

    public class LibClass2 : Lib
    {
        //Raise event here
    }

    static void Main(string[] args)
    {
        LibClass1 lib1 = new LibClass1();
        LibClass2 lib2 = new LibClass2();

        lib1.ShapeChanged += Lib1_ShapeChanged;
        lib2.ShapeChanged += Lib1_ShapeChanged;

        lib1.OnShapeChanged(new MyEventArgs());

    }

这里的完整示例创建一个抽象类,您可以在其中拥有该事件。

答案 2 :(得分:1)

我会继承。例如:

public class ParentClass : Form
{
    public ParentClass() {
        this.FormClosed += sendString;
    }

    private void sendString(object sender, FormClosedEventArgs e)
    {
        throw new NotImplementedException();
    }
}

public class GenericEvent : ParentClass { }
public class LibClass1 : ParentClass { }
public class LibClass2 : ParentClass { }
public class Client : ParentClass { }

现在所有Clases都有ParentClass的事件。

答案 3 :(得分:0)

我有另一种方法。

从一个基类派生所有类。 (当然任何库都可以这样做.net或MFC或Qt或java框架)。

基类中有一个事件“事件1”。在该event1处理程序中,引发“事件2”。

将所有子课程订阅到父课程的“event2”,并在各自的子课程中处理您的业务。