C#接口编程实例向你讲述了事件与接口的联合应用很多初学C#的朋友对于事件与接口感到迷惑不解,不明白它们之间的关系,下面我就用实例来简单的分析讲解一下。

C#接口编程实例问题的解决之前我们来看看事件的创建过程,用event修饰符来代表一个事件,我们要创建一个C#事件必须按以下顺序来扫行:

C#接口编程实例1,创建或标识一个代表。

比如下例中的

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

C#接口编程实例2,创建一个包含事件处理代表,调用事件处理代表的方法的类

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

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

C#接口编程实例3,定义一个或多个把方法连接到事件的类

C#接口编程实例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

  1. public interface IEvents
  2. {
  3. event dele event1; //定义事件
  4. void FireEvent();//定义接口
  5. }

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

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

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

C#接口编程实例代码如下:

Code

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  
            //C#接口编程实例  
            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  
            //C#接口编程实例  
            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",
            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";
        }
        //C#接口编程实例  
        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();//C#接口编程实例之调用事件处理

}
    }

}

转载于:https://www.cnblogs.com/joe-yang/archive/2009/10/19/1585941.html

C#接口编程实例解析[转]相关推荐

  1. python程序实例讲解_python入门编程实例 python入门编程实例解析

    python入门编程实例 python入门编程实例解析 python入门编程实例及解析: 题目:有1.2.3.4四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十 ...

  2. python zookeeper api_Zookeeper接口kazoo实例解析

    本文主要研究的是Zookeeper接口kazoo的相关内容,具体介绍如下. zookeeper的开发接口以前主要以java和c为主,随着python项目越来越多的使用zookeeper作为分布式集群实 ...

  3. c语言编程实例解析精粹,C语言实例解析精粹学习笔记——35(报数游戏)

    实例35: 设由n个人站成一圈,分别被编号1,2,3,4,--,n.第一个人从1开始报数,每报数位m的人被从圈中推测,其后的人再次从1开始报数,重复上述过程,直至所有人都从圈中退出. 实例解析: 用链 ...

  4. af_netlink_netlink socket编程实例解析

    开发和维护内核是一件很繁杂的工作,因此,只有那些最重要或者与系统性能息息相关的代码才将其安排在内核中.其它程序,比如GUI,管理以及控制部分的代 码,一般都会作为用户态程序.在linux系统中,把系统 ...

  5. php xml 接口调用,php的SimpleXML方法读写XML接口文件实例解析

    在php5中读写xml文档是非常方便的,可以直接使用php的SimpleXML方法来快速解析与生成xml格式的文件,下面举例说明: 创建一个SimpleXML对象有三种方法: 1.使用new关键字创建 ...

  6. Linux多线程编程实例解析

    Linux系统下的多线程遵循POSIX线程接口,称为 pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a.顺便说一下,Linux ...

  7. Linux下多线程编程实例解析

    提到线程,不得不让人想起进程,所以还是先写下进程与线程的区别吧! 一.进程与线程的区别 进程是程序执行的一个实例,进程有其自己独立的地址空间.一个线程可以含有多个线程,这也是为了提高系统资源利用率,线 ...

  8. linux c编程项目实例,Linux c编程实例_例子

    例一:字符与整型变量的实现 #include int main() { int c1,c2; char c3; c1='a'-'A'; c2='b'-'B'; c3='c'-; printf(&quo ...

  9. OpenCL编程详细解析与实例

    OpenCL编程详细解析与实例 C语言与OpenCL的编程示例比较 参考链接: https://www.zhihu.com/people/wujianming_110117/posts 先以图像旋转的 ...

  10. java 令牌解析_Java编程guava RateLimiter实例解析

    本文主要研究的是Java编程guava RateLimiter的相关内容,具体如下. 场景1 在流量监管中的应用 约定访问速率(CAR)是流量监管常用技术之一,可以应用在端口进和出方向,一般应用在入方 ...

最新文章

  1. 视觉传感器:3D感知算法
  2. 表上作业法matlab实现,高人帮忙改改,有关表上作业法的C++程序
  3. network programming-简单的TCP客户服务器编程
  4. 【每日一题】4月1日题目 Rinne Loves Edges
  5. 发送邮件 的类 C# .net
  6. 列表页时间日期标签靠显示html,帝国CMS列表页面list.var分别调用年月日,显示个性时间日期...
  7. textarea的光标自动居左的问题
  8. Make 输出重定向到文件
  9. Android Studio(5)--创建 Android 库
  10. R-CNN家族梳理:从R-CNN到Mask R-CNN
  11. iOS各个版本的新特性介绍
  12. 关于Boost库的split函数在不同的编译器下的使用
  13. 如何统计区域内部公路总长度和绘制数据直方图
  14. 【hihocoder 1554】最短的 Nore0061
  15. C语言单片机串转并,74ls164与单片机的串并转换(串转并\串进并出)
  16. 物理学四大神兽,除了“薛定谔的猫”, 你还知道哪几个?
  17. JavaScript基础-数组
  18. 斜线表头html怎么做,Excel三栏斜线表头的完美制作方法
  19. CUDA:两种自适应图像去噪技术KNN和NLM的实例
  20. 步进电机S(SigMoid)曲线加减速【查表法】

热门文章

  1. 基金公司十大非货规模逆袭(2010-2020)
  2. Python实现Diffie-Hellman密钥交换协议
  3. 梁勇:展望 2017年商业智能BI 发展的趋势
  4. ETL、BI、MMP数据库
  5. Julia :迎接0.6的到来
  6. 阿里研究院安筱鹏:数字化,转型与原生并行
  7. 从数据治理、数据资产管理,到数据中台的落地实战!
  8. 【风电功率预测】基于matlab遗传算法优化BP神经网络风电功率预测【含Matlab源码 760期】
  9. 【缺陷识别】基于matlab GUI SVM金属表面缺陷分类与测量【含Matlab源码 682期】
  10. 【二维码识别】基于matlab GUI 灰度+二值化+校正二维码生成与识别【含Matlab源码 635期】