接口(八)事件与接口编程

C# 如何实现接口事件:详解与示例 首先,我们定义一个接口IEventPublisher,该接口包括一个事件OnDataReceived。// 定义事件在接口IEventPublisher中,我们定义了一个事件DataReceived,其类型为EventHandler。DataReceivedEventArgs是一个自定义的事件参数类。接口事件是一种强大而灵活的机制,用于实现类之间的解耦和事件驱动编程。在C#中,通过在接口中定义事件,并在实现类中实现和触发这些事件,我们可以创建高度模块化和可扩展的系统。 阅读详情
很多初学c#的朋友对于事件与接口感到迷惑不解,不明白它们之间的关系,下面我就用实例来简单的分析讲解一下。

  事件,用event修饰符来代表一个事件,我们要创建一个C#事件必须按以下顺序来扫行:

  1,创建或标识一个代表。比如下例中的

public delegate void dele(); //声明代表,delegate 关键字通知编译器 dele 是一个委托类型

  2,创建一个包含事件处理代表,调用事件处理代表的方法的类,如下例

public class EventClass1 : IEvents //IEvents,是下面我们要讲一接口
{
public event dele event1;//定义事件成员event1
public void FireEvent() //当事件发生时
{
event1(); //调用事件处理
}
}

  EventClass1继承接口IEvents,以下后面的EventClass2~4,都是一样。

  3,定义一个或多个把方法连接到事件的类

  4,使用事件

  4.1 定义事件响应方法,如下例中的

IEvents id1 = new EventClass1();

  4.2 使用所定义的构造函数创建一个包含事件的对象,如下例中的

id1.event1 += new dele(EventFired1);

   4.3 触发事件,如下例中的

id1.FireEvent();

  下面我们来看看接口,我们必须用interface来声明一个接口。接口声明可以声明零个或多个成员。接口的成员必须是方法、属性、事件或索引器。接口不能包含常数、字段、运算符、实例构造函数、析构函数或类型,也不能包含任何种类的静态成员。

  所有接口成员都隐式地具有 public 访问权限。接口成员声明包含任何修饰符属于编译时错误。具体地说,接口成员包含下列任何修饰符属于编译时错误:abstract、public、 protected、internal、private、virtual、override 或 static。更多的信息请看msdn help://MS.VSCC/MS.MSDNVS.2052/csspec/html/vclrfcsharpspec_13_1.htm

  在下面的例子中,我们声明IEvents接口,一个方法FireEvent和一个事件event1

public interface IEvents
{
event dele event1; //定义事件
void FireEvent();//定义接口
}

  在后面的EventClass1~4类是继承了接口IEvent,因此在这几个类中必须实现上述一个方法和一个事件。下面的实例可以帮助大家更好的理解。

  这是一个简单的windows Forms,包含一个textbox,几个labels和一个button,在程序启动时焦点在textbox,捕捉键盘按下事件,除方向键外,我能过接口来触事方向键按下事件。

  下面的代码是一个网上常见的例程,大家可以拷贝下来,保存为.cs文件,用CSC编译就行

  代码如下:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace Events_Interfaces
{
public delegate void dele();//声明代表 delegate 关键字通知编译器 dele 是一个委托类型
public interface IEvents //定义接口IEvents,包含方法FireEvent事件event1
{
event dele event1;
void FireEvent();
}
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Label label3;

private System.ComponentModel.Container components =null;

public Form1()
{
InitializeComponent();
}

protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code

private void InitializeComponent()
{
this.textBox1 = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.button1 = new System.Windows.Forms.Button();
this.label2 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.SuspendLayout();

this.textBox1.Location = new System.Drawing.Point(8, 80);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(56,23);
this.textBox1.TabIndex = 1;
this.textBox1.Text = "";
this.textBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Key_Press);

this.label1.Location = new System.Drawing.Point(16, 16);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(256,64);
this.label1.TabIndex = 0;
this.label1.Text = "Whenever you use the arrow keys inside the text box, Corresponding events will be" +"fired to display the label appropriately. Have a try!!";

this.button1.Location = new System.Drawing.Point(240, 112);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(48,23);
this.button1.TabIndex = 3;
this.button1.Text = "Exit";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// label2
//
this.label2.Location = new System.Drawing.Point(88, 80);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(184,23);
this.label2.TabIndex = 2;
this.label2.TextAlign =System.Drawing.ContentAlignment.MiddleCenter;
//
// label3
//
this.label3.Location = new System.Drawing.Point(8, 104);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(64,23);
this.label3.TabIndex = 4;
this.label3.TextAlign =System.Drawing.ContentAlignment.MiddleCenter;
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 16);
this.ClientSize = new System.Drawing.Size(292,141);
this.Controls.AddRange(new System.Windows.Forms.Control[] {this.label3,this.button1,this.label2,this.textBox1,this.label1});

this.Font= new System.Drawing.Font("Comic SansMS",8.25F,System.Drawing.FontStyle.Regular,
System.Drawing.GraphicsUnit.Point,((System.Byte)(0)));
this.Name = "Form1";
this.Text = "Events";
this.ResumeLayout(false);
}
#endregion

static void Main()
{
Application.Run(new Form1());
}

private void Key_Press(object sender,
System.Windows.Forms.KeyEventArgs e)
{
textBox1.Text = "";
label2.Text = "";
string keyId = e.KeyCode.ToString();
switch (keyId)//判断是否按下方向键
{
case "Right":
label3.Text = "";
IEvents id1 = new EventClass1(); //实例化一个接口
id1.event1 += new dele(EventFired1);//定义EventClass1中的事件响应方法
id1.FireEvent();//调用EventClass1中的FireEvent方法,触发event1 事件,事件调用EventFired1方法
break;
case "Left":
label3.Text = "";
IEvents id2 = new EventClass2();
id2.event1 += new
dele(EventFired2);
id2.FireEvent();
break;
case "Down":
label3.Text = "";
IEvents id3 = new EventClass3();
id3.event1 += new
dele(EventFired3);
id3.FireEvent();
break;
case "Up":
label3.Text = "";
IEvents id4 = new EventClass4();
id4.event1 += new
dele(EventFired4);
id4.FireEvent();
break;
default:
label3.Text = keyId;
break;
}
}
//EventFired1方法
public void EventFired1()
{
label2.Text = "";
label2.Text = "You pressed RIGHT arrow key";
}
public void EventFired2()
{
label2.Text = "";
label2.Text = "You pressed LEFT arrow key";
}
public void EventFired3()
{
label2.Text = "";
label2.Text = "You pressed DOWN arrow key";
}
public void EventFired4()
{
label2.Text = "";
label2.Text = "You pressed UP arrow key";
}

private void button1_Click(object sender,
System.EventArgs e)
{
Application.Exit();
}
}
public class EventClass1 : IEvents
{
public event dele event1;
public void FireEvent()
{
event1();
}
}
public class EventClass2 : IEvents
{
public event dele event1;
public void FireEvent()
{
event1();
}
}
public class EventClass3 : IEvents
{
public event dele event1;
public void FireEvent()
{
event1();
}
}
public class EventClass4 : IEvents//EventClass1继承接口IEvents
{
public event dele event1;//定义事件成员event1
//当事件发生时
public void FireEvent()
{
event1();//调用事件处理
}
}

}

Unity UI常用事件接口 UI 组件本身实现了大量的接口,用这些接口来扩展本身的功能。 接口命名规则:IxxxHandler。 I:前缀,表示它是一个接口; xxx:它本身的名字;IDragHandler[拖拽处理器接口] Handler:后缀,表示它是一个特定功能的处理器。 使用步骤: 在使用 UGUI 中的事件的时候,需要在脚本内引入专有命名空间usingUnityEngine.EventSystems; 在当前类继承的父类的后方,用逗号分隔,写需要使用到接口名; 鼠标放到接口名上,Alt+Ente. 阅读详情

相关推荐

登陆框体事件与接口

一、前言 在上一章节中我们把登陆窗体开发完成了,并进行了效果演示。那么接下来我们就需要在这个窗体里面添加行为事件和接口,待完成内容如下; 序号 类型 描述 1 事件 鼠标拖拽窗体移动 2 事件 最小化到快捷栏 3 事件 退出当前窗体 4 事件 使用用户 ID 和密码登陆 5 接口 登陆成功,执行跳转操作 6 接口 登陆失败,执行提示操作 在桌面版程序开发中...

bugstack虫洞栈 2332

C#事件与接口编程实例

很多初学c#的朋友对于事件与接口感到迷惑不解,不明白它们之间的关系,下面我就用实例来简单的分析讲解一下。 事件,用event修饰符来代表一个事件,我们要创建一个C#事件必须按以下顺序来扫行: 1,创建或标识一个代表。比如下例中的public delegate void dele(); //声明代表,delegate 关键字通知编译器 dele 是一个委托类型 2,创建一个包含事...

adiking520110的博客 233

实现接口与事件处理的编程实践

本文详细探讨了在Java编程中实现接口时必须实现所有方法的规则,以及事件监听器的实现和事件处理机制。通过分析RectangleComponentViewer程序的源码,我们了解了如何处理鼠标事件,并且强调了使用事件适配器简化事件监听器实现的重要性。文章还回顾了Java接口的特性、事件监听器的作用以及如何在实际编程中应用这些概念。

weixin_42311427的博客 368

接口与事件监听机制

接口与事件监听机制 一、接口 接口的定义: 定义接口的关键字:interface 定义格式: public interface 接口名 extends 接口,... { //定义常量 public static final 数据类型 常量名 = 值; //定义抽象方法 public abstract 返回值数据类型 方法名(数据类型 参数名,...); ...

或许的博客 870

C#中接口与链式编程的综合应用

在软件开发中,接口是定义了一组方法但没有实现的方法签名集合。在C#中,接口定义了一组规范,这些规范必须被任何实现了该接口的类或结构遵循。接口在C#中通常用于实现多态性和解耦,这对于构建可扩展和可维护的代码库至关重要。接口不仅允许开发者定义可以由多个不同对象实现的功能集合,而且它们是实现多重继承的关键机制,尽管C#语言本身不支持传统的多重继承,但通过接口可以达到类似的效果。在这一章中,我们将探讨接口的定义、它们在C#程序中的作用,以及它们如何影响现代软件设计。

weixin_35886636的博客 1114

STM32H743 ADC校准失败排查:HAL_ADCEx_Calibration_Start()的正确调用时机

本文深入剖析了STM32H743 ADC校准失败的核心原因,即错误地在ADC使能状态下调用HAL_ADCEx_Calibration_Start()函数,导致读数漂移。文章详细解释了校准必须在ADC禁用状态下进行的硬件原理,列举了典型错误场景,并提供了上电初始化与周期性重校准的正确代码实践,帮助开发者彻底解决ADC精度问题。

ik678901的博客 1177

接口与事件

一、接口: 1、接口的定义: 关键字: interface 格式: public interface 接口名{ } 2、接口的属性: []其中的内容,可以省略。 [public static final] 属性类型 属性名 = 属性值; static : 静态的,修饰属性,属性可以通过类名/接口名直接访问。 final: 不可改变的,修饰属性,属性不可改变,并且必须初始化。 3、接口的方法: [...

jinmengyao的博客 698

Cesium高效渲染海量GeoJSON数据的7种优化策略与实战解析

本文深入解析Cesium高效渲染海量GeoJSON数据的7种优化策略,包括瓦片化转换、LOD分级加载、数据简化等关键技术。通过实战案例展示如何解决渲染卡顿问题,提升矢量数据加载性能,实现流畅的60FPS交互体验。特别针对GeoJSON大数据量场景提供完整优化方案。

h0i1j2k3l的博客 934

java——认识事件与接口

1.接口         什么是接口:接口就是一些方法特征的集合------接口是对抽象的抽象。         什么是抽象类:抽象类对某具体类型的部分实现------抽象类是对具体的抽象         Java接口(抽象类)用来声明一个新的类型。Java设计师应当主要使用接口和抽象类将软件单位与内部和外部耦合起来。 接口的定义 定义接口的关键字:interface 格式: pub

Traip的博客 1346

apt-get update时出现GPG error:... bionic InRelease:The following signatures were invalid: EXPKEYS解决方案

本文主要介绍了apt-get update时出现W: GPG error: … bionic InRelease: The following signatures were invalid: EXPKEYSIG B7B3B788A8D3785C MySQL Release Engineering E: The repository ‘… bionic InRelease’ is not signed.解决方案,希望能对使用Ubuntu系统的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 11万+

华为OD新系统机试真题 - 端口流量统计

华为OD机试新系统真题【端口流量统计】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统4月26号机试真题【端口流量统计】。

qq_45776114的博客 762

如何:实现接口事件(C# 编程指南)

  C# 编程指南如何:实现接口事件(C# 编程指南) 接口可声明事件。下面的示例演示如何在类中实现接口事件。接口事件的实现规则与任何接口方法或属性的实现规则基本相同。在类中实现接口事件在类中声明事件,然后在适当的位置调用该事件。 复制代码public interface IDrawingObject{    event EventHandler S

zhihua_l的专栏 1830

Plant Simulation与ABB机器人虚实结合

Plant Simulation与ABB机器人虚实结合

santayana的专栏 1869

事件与接口

事件与接口 1.接口 之前说过继承只能单继承,即子类只有继承(extends)一个父类,而类可以实现(implements)多接口。 例如: 行动监听器 ActionListener 接口(父类)的定义 格式 interface 类名{} 要求 1.不可以定义变量; 2.此类中构造方法时不能构造方法体,即接口的类中只能是抽象方法,不能是构造方法; 3.不能实例化接口; 接口的实现(子类) 定义一个...

小月亮的博客 443

基于YOLOv11的手写数字与符号识别系统设计与实现

手写数字与符号识别系统需要丰富多样的训练数据才能达到理想的泛化性能。MNIST:包含70,000个手写数字样本(0-9),28x28灰度图像优点:干净整齐,适合初学者缺点:多样性不足,只有数字EMNIST:MNIST的扩展,包含数字、字母(大小写)和特殊符号样本量:814,255张图像覆盖62个类别(10数字+26小写字母+26大写字母)HASYv2:专门的手写符号数据集包含369个不同符号类别约168,000个标注实例包括数学符号、箭头、括号等:英文手写文本数据库。

YOLO 291

PCL 三次均匀B样条曲线拟合

PCL 三次均匀B样条曲线拟合

dayuhaitang1的博客 400

ABAP 类、接口、事件

基类:(父类)被继承,继承基类的类被称为派生类。ABAP所有的类都是默认继承了空类object.具有一般性的类称为基类(superclass),其各个子类被称为派生类(subclass)。 一个类只可以有一个基类(父类),但是可以有多个派生类(被多次继承)。 多态:子类继承父类可以使用父类的方法,也可以重载父类的方法(此方法需为实例方法)。但是如果需要使用父类(基类)的方法,则需要使用关键词SUPER,两个派生类使用父类的参数和方法是并不相互影响。 Receiving 的使用 CALLMETH...

weixin_42646630的博客 3464

点云处理指南介绍

指南目录,Open3D与PCL内容介绍

NNNNNathan的博客 1万+

COMSOL中事件接口介绍一,显示事件

本文主要介绍近期在学习电磁场和温度场的仿真中学习到的一个COMSOL接口—事件(Events),其中包含显示事件和隐式事件两种。显示事件处理知道载荷变化的具体时间,而隐式事件处理不知道载荷变化的具体时间,但可以是对温度等物理量的监测。如果大家有兴趣,请继续往下看。

怎么又是萝卜的博客 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C# 如何实现接口事件

接口可声明事件。 下面的示例演示如何在类中实现接口事件。 实现接口事件的规则与实现任何接口方法或属性的规则基本相同。 在类中实现接口事件 在类中声明事件,然后在适当的区域调用该事件。 namespace ImplementInterfaceEvents { public interface IDrawingObject { event EventHandle...

zztoll的专栏 2736

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

关于接口与事件监听器

关于接口与事件监听器 接口(interface) 接口的声明方式:public interface 接口名{ } 接口中的方法:接口中的方法被隐式的指定为public abstract,(其他修饰符均会报错)。接口中的方法没有方法体,即方法不能在接口中实现。 接口中的变量:接口中的变量会被隐式的指定为public static final变量,(用private修饰会报错)。 接口与类的关...

weixin_44100774的博客 610

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java语言的事件驱动编程

事件驱动编程是一种编程范式,它使得程序可以响应各种输入(事件),此类输入可以是用户的操作、系统的信号,或者其他程序的任务。在Java语言中,事件驱动编程尤为常见,特别是在图形用户界面(GUI)应用程序的开发中。在这篇文章中,我们将深入探讨Java语言中的事件驱动编程,包括其基本概念、核心组件、实现方式,以及相关的最佳实践。

2501_91310487的博客 1058

Java之接口与事件

2016.06.11 上课内容:接口与事件            突然发现以前上课的好多内容都忘了,又恳求熊哥给我讲了一遍,发现还是很有收获的。下面把讲过的知识总结下。       1.接口:       接口的定义关键词是interface       接口的定义形式是:public interface 接口名 extends 接口1,接口2....{              ...

iteye_20668的博客 264

C#:实现接口中定义的事件

public delegate void TestDelegate(); // delegate declaration public interface ITestInterface { event TestDelegate TestEvent; void FireAway(); } public class TestClas...

acass424022的博客 1172

八.接口和事件

1.定义接口的语法格式 关键字是interface 格式: public interface 接口名 extends 接口名,...{ //常量 public static final 数据类型 常量名 = 值; 注意:常量名所有的字母全部大写。 //抽象方法 public 返回值类型 方法名(参数类型 参数名,...); 注意:不能加{},如...

xingqiu612的博客 209
上一篇: 接口(七)覆盖序接口
下一篇: 接口(九)用接口和抽象类,与不用究竟究竟有什么区别或好处?
阿达King哥
博客等级 码龄23年 387粉丝 244原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值