您的位置:软件 > 开发者网络 > 微软开发专栏 > Visual Studio.net专栏 > C# > 正文
Visual C#事件与接口编程实例
[文章信息]
作者:蚕蛹
时间:2003-05-19
出处:yesky
责任编辑:方舟
[文章导读]
很多初学c#的朋友对于事件与接口感到迷惑不解,不明白它们之间的关系,下面我就用实例来简单的分析讲解一下
advertisement
热点推荐
· 11.15软件精选 制作MSI文件
· 闪客五周年之闪客光荣榜
· 用Winamp“品尝”无限音乐
· 网络加、解密的技术应用
· 闪客五周年之闪客光荣榜:zoron
[正文]

  很多初学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();//调用事件处理
}
}

}

 


·"WAP天极之IT新闻资讯,50万元等你拿"    ·天极WAP之游戏狂图,50万元等你下载

天极社区邀请您:写博客日记  上传相片   论坛聊天  订阅电子杂志  推荐网摘   免费图铃工具
笔名:   请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。
评论:
 

发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容阅读排行榜
  • C#多线程编程实例实战
  • Visual C# .NET 2003的改变
  • 百万程序员的苦恼-选择VB.NET还是C#
  • 11.15软件精选 制作MSI文件
  • 闪客五周年之闪客光荣榜
  • 兰欣推出我国第一款网络游戏专用音箱
  • 玩家发现117亡灵种族Bug
  • [配置推荐]极品HIFI配置
  • 东瀛美少女COSPLAY(55)
  • 用Winamp“品尝”无限音乐
  • 迷你型PStwo全面透析专题
  • Advertisement

    天极无线
    待机彩图    >>更多
    多彩动画    >>更多
    美妙和弦    >>更多
    天使在唱歌
    壁虎漫步
    PrettyBoy
    LoveLoveLove
    我是你的小小狗
    单身情歌
    十面埋伏
    祝酒歌
    回心转意
    波斯猫
    太委屈
    S.H.E
    潘玮柏
    M2M
    蔡依林
    阿牛
    林志炫
    陈弈迅
    刀郎
    黑龙
    S.H.E
    陶晶莹
    情人玫瑰坊
    音乐风云
    新片速递
    神秘测试
    都市约会
    ·天极彩信天天精彩
    ·图铃梦工厂下载无限!
    ·找寻童真,卡通专题
    ·夏日激情交友社区!
    ·星座运程,预测人生

    CSEEK搜索