如何使用界面中创建的事件 [英] How to use event created in interface

查看:57
本文介绍了如何使用界面中创建的事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  public   interface  MyEvent {
事件 EventHandler myNewEvent;
}





我不知道如何在同一个类中初始化此事件并在其他类中调用它。任何帮助请。我喜欢这样的东西:



  public   class  MyClass:MonoBehaviour,MyEvent {
public delegate < span class =code-keyword> void EventHandler();
public event EventHandler myNewEvent; // 但这里我有错误

}





如何做到这一点?

解决方案

这很有可能,隐式接口实现。您的问题与接口中事件成员的特性无关。你唯一的问题是 EventHandler 的定义;你可以简单地使用可用的 System.EventHandler



例如:

 < span class =code-keyword> public   class  MonoBehaviour { / *   ... * / } 

public 接口 MyEvent {
event System.EventHandler myNewEvent;
}

public class MyClass:MonoBehaviour,MyEvent {
// public delegate EventHendler; //删除它,它已经定义
public event System.EventHandler myNewEvent; // 此处没问题
}

如果您需要你自己的委托类型(不太可能;通常它只足以定义派生自 System.EventArgs 的类,并使用从泛型类型实例化的事件处理程序类型System.EventHander< your_event_args_type_here> ),确保在您使用它的地方可以访问该定义。



-SA


我假设如果您希望基于接口实现自定义事件,您可能希望有一个自定义EventArgs类来传递自定义数据:

  public   interface  MyEvent 
{
// EventHandler< t>自.NET 2.0起可用
event EventHandler< customeventargs> myNewEvent;
}

public class CustomEventArgs:EventArgs
{
public int Number { set ; get ; }
public string 名称{ set ; get ; }

public CustomEventArgs( int number,字符串名称)
{
Number = number;
姓名=姓名;
}
}

public class ImplementsMyEventInterface: MyEvent
{
public event EventHandler< customeventargs> myNewEvent;

受保护 虚拟 void OnMyNewEvent(CustomEventArgs args)
{
EventHandler< customeventargs> handler = myNewEvent;
if (handler!= null )handler(,args);
}
}

// 使用示例:

private void SomeForm_Load( object sender,EventArgs e)
{
var instanceOfMyEvent = new ImplementsMyEventInterface();

instanceOfMyEvent.myNewEvent + = instanceOfMyEvent_myNewEvent;
}

// 表格中的EventHandler
private void instanceOfMyEvent_myNewEvent( object sender,CustomEventArgs e)
{
Console.WriteLine( 在EventHandler中实现'myNewEvent实例中的'类'usesMyEvent');
Console.WriteLine( e.Number = {0} e.Name = {1},e.Number,e.Name);
}

// 举起活动的例子:

private void SomeButton_Click( object sender,EventArgs e)
{
instanceOfMyEvent_myNewEvent( this new CustomEventArgs(number: 100 ,name: hello ));
} < / customeventargs > < / customeventargs > < / customeventargs > < span class =code-keyword>< /
t >


public interface MyEvent{
    event EventHandler myNewEvent;
}



I don't know how to init this event in same class and call it in some other class. Any help pls. I like something like:

public class MyClass : MonoBehaviour, MyEvent {
     public delegate void EventHandler();
     public event EventHandler myNewEvent; // But here I have error

}



How to do this?

解决方案

This is quite possible, with implicit interface implementation. Your problem is unrelated to the peculiarities of event members in the interfaces. Your only problem is the definition of EventHandler; you can simply use available System.EventHandler.

For example:

public class MonoBehaviour { /* ... */ }

public interface MyEvent{
    event System.EventHandler myNewEvent;
}

public class MyClass : MonoBehaviour, MyEvent {
    // public delegate EventHendler; // remove it, it is already defined
    public event System.EventHandler myNewEvent; // no problem here
}

If and when you need your own delegate type (unlikely; usually it's enough to only define the class derived from System.EventArgs and use the event handler type instantiated from the generic type System.EventHander<your_event_args_type_here>), make sure the definition is accessible where you use it.

—SA


I assume that if you wish to implement a custom event based on an Interface, you'll probably want to have a custom EventArgs class for passing custom data:

public interface MyEvent
{
    // EventHandler<t> available since .NET 2.0
    event EventHandler<customeventargs> myNewEvent;
}

public class CustomEventArgs : EventArgs
{
    public int Number { set; get; }
    public string Name { set; get; }

    public CustomEventArgs(int number, string name)
    {
        Number = number;
        Name = Name;
    }
}

public class ImplementsMyEventInterface : MyEvent
{
    public event EventHandler<customeventargs> myNewEvent;
    
    protected virtual void OnMyNewEvent(CustomEventArgs args)
    {
        EventHandler<customeventargs> handler = myNewEvent;
        if (handler != null) handler(this, args);
    }
}

// example of use:

private void SomeForm_Load(object sender, EventArgs e)
{
    var instanceOfMyEvent = new ImplementsMyEventInterface ();
    
    instanceOfMyEvent.myNewEvent += instanceOfMyEvent_myNewEvent;
}

// EventHandler in Form
private void instanceOfMyEvent_myNewEvent(object sender, CustomEventArgs e)
{
    Console.WriteLine("In EventHandler for implementation of 'myNewEvent in instance of the class 'usesMyEvent");
    Console.WriteLine("e.Number = {0} e.Name = {1}", e.Number, e.Name);
}

// example of raising the event:

private void SomeButton_Click(object sender, EventArgs e)
{
    instanceOfMyEvent_myNewEvent(this, new CustomEventArgs(number: 100, name: "hello"));
}</customeventargs></customeventargs></customeventargs></t>


这篇关于如何使用界面中创建的事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆