C#学习笔记8:接口、委托、事件

今日继续我的C#学习之路,今日学习接口、委托、事件,文章从实践出发学习这三个设计理念,并提供完整源码

目录

1、接口(多重继承):

代码:

运行结果:

2、委托(方法的代理/函数指针):

创建控制台程序实现委托:

遇到的报错及解决:

修改后的代码:

运行结果:

3、事件:

 定义事件:

创建控制台程序,假设一个热水器

代码:

运行结果:


1、接口(多重继承):

C#不支持类的多重继承,但可以继承多个接口

C#中的多重继承要用接口来实现,接口就是为了实现多继承而产生的,

C#中,接口可多继承,接口之间可互相继承,普通类和抽象类可以继承自接口,一个类可以同时继承一个类和多个接口,但是接口不能继承类

(1)接口名是任意合法的标识符,建议以大写I开头。
(2)声明的接口可以继承一个基类和多个其他接口。
(3)接口修饰符可以是new、public、protected、internal、private。
(4)接口成员前面不允许有修饰符,都默认为公有成员。
(5)接口成员可以分为四类-方法、属性、事件和索引器,而不能包含成员变量

(6)不能在声明接口的同时编写接口成员的实现代码。 

接口要通过继承才能实现,即定义继承接口的类,并在类中实现所有的接口成员

class 类名:[基类名],接口名1,接口名2...
{
    类成员
}

定义的类必须提供被继承接口中所有成员的实现,否则将产出编译错误

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Ipoint_YZH
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //应用接口的派生类Point实例化一个新的对象并进行初始化赋值
            Point p = new Point(5,30);
            Console.WriteLine("创建的点坐标是:x={0},y={1}\n",p.x,p.y);
            Console.ReadLine();
        }
        public interface IPoint
        {
            int x { get; set; }//定义属性成员x,他含有读写的抽象访问
            int y { get; set; }//定义属性成员y,他含有读写的抽象访问
        }
        class Point:IPoint
        {
            //定义俩个类内部访问的私有成员变量
            private int px;
            private int py;

            //构造函数实现类初始化,为私有变量赋值
            public Point (int x,int y)
            {
                px = x;
                py = y;

            }

            //接口属性x实现
            public int x
            {
                get { return px; }//实现读访问
                set { px = value; }//实现写访问
            }
            //接口属性y实现
            public int y
            {
                get { return py; }//实现读访问
                set { py = value; }//实现写访问
            }

        }


    }
}

运行结果:

2、委托(方法的代理/函数指针):

委托是C#特有的功能,也翻译为代理、代表、指代

C#中没指针的概念,但通过委托可以实现C/C++中函数指针的功能,且比函数指针更强

方法的委托就是方法的别名(或叫方法的代理)

通过委托不仅能执行方法,还能将方法传到其他方法中,实现方法回调等。

 能被委托的方法必须是在运行时为内存中已经确定的方法,如静态方法、对象的方法,而类的非静态方法(没实例化)是不能被委托的;

定义委托格式语法如下:

其中属性、修饰符可选(new、public、internal、protected、private)

属性 修饰符 delegate 返回类型 委托类型名(参数列表);
public delegate void Delegate1();
public delegate int Delegate2(string s);
public delegate string Delegate3(int i,int j);

委托的实例化:

委托对象 = new 委托类型(关联方法);
//创建委托对象fd,它关联对象a的方法f()
MyDelegate fd=new MyDelegate(a.f);

//这句关联A的静态方法g()
MyDelegate gd=new MyDelegate(A.g);

创建控制台程序实现委托:

遇到的报错及解决:

严重性    代码    说明    项目    文件    行    禁止显示状态
错误    CS0236    字段初始值设定项无法引用非静态字段、方法或属性“Program.B.mdh”    Weituo    D:\visualstudioWorkstation\Weituo\Weituo\Program.cs    32    活动

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Weituo
{
    internal class Program
    {
        public delegate int myDelegateHandler(int a,int b);
        static void Main(string[] args)
        {

        }

        public class A
        {
            //静态的处理方法,返回俩数相加之和
            public static int M1(int a, int b)
            {
                int c = a + b;
                return c;
            }
        }

        public class B 
        {
            //实例一个委托
            myDelegateHandler mdh = new myDelegateHandler(A.M1);
            //调用委托
            int sum = mdh(1, 2);

        }

    }
}

问题出在框出的位置:

修改后的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Weituo
{
    internal class Program
    {
        public delegate int myDelegateHandler(int a,int b);

        public class A
        {
            //静态的处理方法,返回俩数相加之和
            public static int M1(int a, int b)
            {
                int c = a + b;
                return c;
            }
        }

        public class B 
        {
            static void Main(string[] args)
            {
                //实例一个委托
                myDelegateHandler mdh = new myDelegateHandler(A.M1);
                //调用委托
                int sum = mdh(1, 2);
                Console.WriteLine(sum);
                Console.ReadLine();
            }
        }

    }
}

运行结果:

3、事件:

事件是 C#中的一个高级概念,是操作发生时允许执行特定应用程序的代码机制。

事件要么在相关联的操作发生前发生(事前事件),要么在操作发生后发生(事后事件)。

当用户单击窗口中的按钮时,将引发一个事后事件,以允许执行特定于应用程序的方法。

类或对象可以通过事件向其他类或对象通知发生的相关事件。

发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。

在典型的 C# Windows窗体或 Web应用程序中,可以订阅由控件(如按钮盒列表框)引发的事件,“学生开始答卷”是这个事件引发的动作,老师是事件的发行者,学生是事件的订户。

 定义事件:

[访问修饰符]event 委托名 事件名;
//定义事件eventMe
public delegate void delegateMe();
private event delegateMe eventMe; 

在C#类中定义和使用事件一般有以下几个步骤:

//(1)在一个类中声明关于事件的委托
public delegate void 事件类型名称(object sender,EventArgs e);

//(2)在类中声明事件,使用步骤(1)中的delegate作为事件类型
public event 事件类型名称 事件名称

//(3)在类中需要引发事件的方法中,编写引发事件的方法
事件名称(this,new EventArgs());
//或者
if(事件名称!=null) 事件名称(this,new EventArgs());

//(4)订阅事件,当事件发生时通知订户
带有事件类型的实例.事件名称 +=new 事件名称(事件处理方法名称);

//(5)编写事件处理方法
public void 事件处理方法名称(object sender,EventArgs e);
    {
        //代码
    }

//(6)适当条件下触发事件,调用步骤(3)中引发事件的方法

创建控制台程序,假设一个热水器

当通电加热到水温超过96℃时,扬声器会发出语音告诉你水的温度,

液晶屏显示水温的变化,提示水快开了。

定义一个类来代表热水器的类 Heater,其中有

代表水温的字段temperature

有给水加热的BoilWaterO方法

发出语音报警的 MakeAlertO方法

显示水温的ShowMsgO方法

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace shijian_reshuiqi
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Heater heater = new Heater();//创建热水器对象heater
            Alarm alarm = new Alarm();//创建报警器对象alarm
            heater.BoilEvent += alarm.MakeAlert;//给alarm类的MakeAlert方法订阅事件
            heater.BoilEvent += Display.ShowMsg;//给Display类的 ShowMsg静态方法订阅事件
            heater.BoilWater();//烧水
            Console.ReadLine();
        }
        //Heater热水器类
        public class Heater
        {
            private int temperature;//声明表面当前水温字段
            public delegate void BoilHandler(int param);//声明关于事件的委托
            public event BoilHandler BoilEvent;//声明水要烧开的事件

            public void BoilWater()//烧水的方法
            {
                for (int i=0;i<=100;i++)//水温超过96,引发事件BoilEvent
                {
                    temperature = i;
                    if(temperature>96)
                    {
                        if(BoilEvent!=null)
                        {
                            BoilEvent(temperature);//调用所有订阅对象的方法
                        }
                    }
                }
            }

        }

        public class Alarm //定义Alarm警报
        {
            public void MakeAlert(int param)
            {
                Console.WriteLine("提示:水已经{0}度了", param);
            }
        }

        public class Display//显示水温的类
        {
            public static void ShowMsg(int param)
            {
                Console.WriteLine("Display:s水快烧开了,当前温度:{0}度",param);
            }
        }


    }
}

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/522696.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一款轻量、干净的 Vue 后台管理框架

开始之前 在开始介绍之前我想谈谈为什么要自己做一个后台管理&#xff0c;我知道很多人都用一些开源的后台管理项目&#xff0c;这些老前辈有很多亮点值得学习&#xff0c;但是存在的一些问题同样不可忽视&#xff0c;我认为很多开发者会被困扰(仅代表个人观点) 技术栈老旧不升…

C语言进阶课程学习记录-第24课 - #pragma 使用分析

C语言进阶课程学习记录-第24课 - #pragma 使用分析 #pragma实验-#pragma messagecmd窗口运行 实验-pragma oncebcc编译报错gcc编译成功global.h代码优化 #pragma pack实验BCC编译器输出 小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程…

特征提取算法

特征提取算法 0. 写在前边1. Harris算法1.1 写在前面1.2 Harris算法的本质1.3 Harris算法的简化 2. Harris3D2.1 Harris3D算法问题定义2.2 Harris3D with intensity2.3 Harris3D without intensity 3. ISS特征点的应用 0. 写在前边 本篇将介绍几种特征提取算法&#xff0c;特征…

服务器数据恢复—EqualLogic PS6100系列存储数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌EqualLogic PS6100系列存储阵列是一款容错功能较强的存储设备&#xff0c;具有较高的安全性能。一些硬件故障或者误操作也会破坏该系列存储内的数据&#xff0c;下面分享一个北亚企安数据恢复工程师接到的一个关于EQ PS6100存储的数据恢复…

java学习之线程池

java线程池优点&#xff1a; 降低线程创建和销毁的开销&#xff0c;提高系统性能。 提高线程的利用率和系统的吞吐量。 统一线程的管理和监控&#xff0c;避免线程泄漏和线程安全问题。 支持任务队列和拒绝策略等机制&#xff0c;提供灵活的任务调度和任务处理能力。 并不…

【网络安全之渗透测试】公开课-即将开始

​4月13日&#xff0c;下午一点&#xff0c;网络安全-渗透公开课&#xff0c;感兴趣的可以留言免费参加 &#x1f525;&#x1f525;&#x1f525;大新闻来啦&#xff01;各位网络安全爱好者、IT从业者、或者是想要保护自己的数字生活的小伙伴们&#xff0c;注意了&#xff01;…

利驰软件荣获2023年度中国智能制造优秀供应商及优秀推荐产品奖

2024年3月28-29日&#xff0c;由e-works数字化企业网主办的“第十三届中国智能制造高峰论坛暨第二十一届中国智能制造岁末盘点颁奖典礼”于北京西南华邑酒店召开。 大会邀请了中国工程院院士、阿里研究院副院长、国家智能制造专家委员会委员等行业专家&#xff0c;以及国内外知…

银行ITSS体系下低代码运维体系实践分享

前言 自2021年中国人民银行发布《金融科技发展规划&#xff08;2022-2025年&#xff09;》以来&#xff0c;商业银行迈入数字化转型的高阶阶段。在此背景下&#xff0c;为了进一步提高金融科技的管理水平&#xff0c;商业银行需要改变传统金融运维模式&#xff0c;对已有运维体…

Web漏洞-文件上传常见验证

后缀名&#xff1a;类型&#xff0c;文件头等 后缀名&#xff1a;黑白名单 文件类型&#xff1a;MIME信息 文件头&#xff1a;内容头信息 常见黑名单&#xff08;明确不允许上传的格式后缀&#xff09;&#xff1a;asp、php、jsp、aspx、cgi、war &#xff08;如果没有完整…

Retrofit2 完全解析 探索与okhttp之间的关系

//用于访问zhy的信息 http://192.168.1.102:8080/springmvc_users/user/zhy //用于访问lmj的信息 http://192.168.1.102:8080/springmvc_users/user/lmj 即通过不同的username访问不同用户的信息&#xff0c;返回数据为json字符串。 那么可以通过retrofit提供的PATH注解非…

Java文件流操作

一、文件创建和删除 public static void main(String[] args) throws IOException {File file new File("..\\hello-world.txt");//..表示在上机目录下创建hello-world.txtSystem.out.println(file.getPath());//返回当前相对路径System.out.println(file.getCanoni…

电商技术揭秘十二:电商平台的搜索引擎优化与营销小结

相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xff1a;电商平台…

图像分割 - 利用K-means聚类方法实现图像分割

1、前言 传统的数字图像处理算法中,针对于图像分割部分,除了阈值处理、区域生长啊等等之类的,还有很经典的聚类算法 图像分割是指将图像划分为多个片段。这是因为对于不同的图像任务,我们往往不care整个图片,只对感兴趣的区域处理,这就是图像分割的意义。 聚类算法的思…

2024.4.6-day11-CSS 背景和精灵图

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 作业2024.4.6学习笔记1 背景2 背景图片3 CSS 精灵图 作业 <!DOCTYPE html&…

消息中间件之消息通信模型MQ

一&#xff0c;为什么需要MQ&#xff1f; 应用中&#xff0c;经常需要对庞大的海量数据进行监控&#xff0c;随着网络技术和软件开发技术的不断提高&#xff0c;在实战开发中MQ的使用与日俱增&#xff0c;特别是RabbitMQ在分布式系统中存储转发消息&#xff0c;可以保证数据不…

ezuikit.js播放链接三种方式

第一种&#xff1a;iframe嵌入的方式 适用于ezopen开头的链接格式 举例&#xff1a;ezopen://open.ys7.com/BB98332770/1.hd.live <iframeid"ysOpenDevice"src{https://open.ys7.com/ezopen/h5/iframe? url${item.url}&autoplay1&accessToken${item…

全网最详细的网络安全自学笔记

1.选择方向 首先是选择方向的问题&#xff0c;网络安全是一个很宽泛的专业&#xff0c;包含的方向特别多。比如 web安全&#xff0c;系统安全&#xff0c;无线安全&#xff0c;二进制安全&#xff0c;运维安全&#xff0c;渗透测试&#xff0c;软件安全&#xff0c;IOT安全&am…

揭秘月赚600万的团购新模式:零风险购物竟能带来丰厚收益?

你是否曾经被看似赔钱的买卖吸引&#xff0c;最后却发现其背后的巨大盈利潜力&#xff1f;这种震撼的体验&#xff0c;让我深感好奇与惊喜。今天&#xff0c;我将与你分享一个不同寻常的商业模式&#xff0c;它或许能启发你走上属于自己的盈利之路。 这家小程序商城以其独特的团…

编译原理实验3(基于算符优先文法分析的语法分析器 )

实验目的 加深对语法分析器工作过程的理解&#xff1b;加强对算符优先分析实现语法分析程序的掌握&#xff1b;能够产用一种编程语言实现简单的语法分析程序&#xff1b;能够使用自己编写的分析程序对简单的程序段进行语法分析。 实验要求 根据简单表达式文法构造算符优先分…

实景三维在文化旅游领域的应用

实景三维技术&#xff0c;作为一种前沿的科技手段&#xff0c;近年来在文化旅游领域的应用逐渐崭露头角。它能够将真实世界的场景以三维的形式精确呈现&#xff0c;为游客带来身临其境的体验&#xff0c;为文化旅游注入新的活力。本文将探讨实景三维在文化旅游领域的应用及其所…