C#-抽象类与接口

文章目录

  • 一、抽象类和接口总结
    • 总结
    • 补充说明
    • 主要区别
  • 二、抽象类
    • 2.1 抽象类概述与声明
    • 2.2 抽象方法
    • 2.3 抽象类与抽象方法的使用
  • 三、接口
    • 3.1 接口概述
      • 概述
      • 特征
      • 声明
      • 示例
    • 3.2 接口的实现和继承
      • 说明
      • 示例
    • 3.3 显式接口成员实现
      • 说明
      • 注意
      • 示例

一、抽象类和接口总结

总结

抽象类和接口这两种类型用于完全不同的目的。抽象类主要用作对象的基类,贡献某些主要的特性,例如共同的目的和结构。
接口则主要是用于类,为这些类去添加不同的方法(行为)。

补充说明

抽象类和接口都包含可以由派生类继承的成员,他们都能直接实例化,但可以声明他们的变量;
这样做,可以使用多态性把继承这两种类型的对象指定给他们的变量;
接着通过这些变量来使用这些类型的成员,但不能直接访问派生类中的其他成员【如上述例子】

主要区别

1、他们的派生类只能继承一个基类,即只能直接继承一个抽象类,但可以继承任意多个接口;
2、抽象类中可以定义成员的实现,但接口中不可以;
3、抽象类中可以包含字段、构造函数、析构函数、静态成员或常量等,接口中不可以;
4、抽象类中的成员可以是私有的(只要他们不是抽象的)、受保护的、内部的或受保护的内部成员(受保护的内部成员只能在应用程序的代码或派生类中访问),但接口中的成员必须是公共的。

二、抽象类

2.1 抽象类概述与声明

一般将父类定义为抽象类,需要使用这个父类进行多态与继承。
继承树中越是向上,类就越发抽象;例如:奔驰继承汽车类,汽车类继承交通工具类等。

声明:使用abstract关键字

访问修饰符  abstract class 类名:基类或接口
{
}

声明抽象类

public abstract class myClass
{public int i;public void func(){	}
}

声明抽象类时,abstract、class和类名外是必须的;其余可选

2.2 抽象方法

抽象方法没有方法体,这个方法本身没有任何意义,需要被继承的类进行重写。
如果一个类中有抽象方法,那么这个类就需要被标记为抽象类。

抽象方法必须声明在抽象类中。
声明抽象方法时,不能使用virtual、static、private修饰符。

抽象方法声明引入了一个新方法,不提供方法的实现,因此方法体只包含一个分号。
当从抽象类的派生一个非抽象类时,需要在非抽象类中重写抽象方法,以提供具体的实现,重写抽象方法时使用override关键字。

声明:使用使用abstract关键字

public abstract class myClass
{public int i;public void func(){	}//声明抽象方法public abstract void method();
}

2.3 抽象类与抽象方法的使用

//声明抽象类abstract class MyClass{private string name;private int age;public string Name{get { return name; }set { name = value; }}public int Age{get { return age; }set { age = value; }}//抽象方法public abstract void showInfo();}//继承抽象类class SonClass : MyClass{//重写抽象方法public override void showInfo(){Console.WriteLine($"My name is:{this.Name},I am {this.Age} years old.");}}internal class Program{static void Main(string[] args){SonClass sonClass = new SonClass();	//实例化派生类MyClass son = sonClass;	//使用派生类实例化抽象类son.Age = 10;son.Name = "Nick";son.showInfo();Console.ReadLine();}}

运行结果:
运行结果

三、接口

3.1 接口概述

概述

由于C#中是单继承,但客观世界中出现多重继承的情况比较多,因此通过接口实现多重继承的功能。
接口是抽象类的延申,可以视作纯粹的抽象类,其中的所有方法都没有方法体。
使用接口继承关系
接口用来定义程序的协议,描述可属于任何类或结构的一组相关行为。
接口可由 方法、属性、事件、索引器 4种成员类型的任何组合构成,但不能包含字段。
类和结构可以继承多个接口,接口也可以继承其他的接口。

特征

接口可以将方法、属性、索引器、事件作为成员,但不能给这些成员设置具体的值。
特征:
类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。
不能直接实例化接口。
接口可以包含事件、索引器、方法和属性。
接口不包含方法的实现。
类和结构可从多个接口继承。
接口自身可从多个接口继承。

声明

使用interface关键字,语法格式如下:

修饰符		interface		接口名称:继承的接口列表
{接口内容;
}

声明接口时,除interface关键字和接口名称外,其他的都是可选项;
可使用new、public、protected、internal、private等修饰符声明接口,但接口成员必须是公开的。

示例

interface ImyInterface
{string ID		//编号(可读可写){get;set;}string Name		//姓名(可读可写){get;set;}void ShowInfo();		//显式定义的编号和姓名
}

3.2 接口的实现和继承

说明

实现接口成员,类中对应的成员必须是公共的、非静态的,并且与接口成员具有相同的名称和签名。
类的属性和索引器可以为接口上定义的属性或索引器定义额外的访问器;例如,接口定义一个带有get的访问器属性,而实现该接口的类,可以声明同时带有get和set访问器的同意属性;但是,如果属性或索引器使用 显示 实现,则访问器必须匹配。

接口的实现通过类继承实现。声明实现接口的类时,需要在基类列表中包含所实现的接口的名称。

示例

    interface ITest1{void Test1();}interface ITest2:ITest1{void Test2();}class TestClass :  ITest2{public void Test1(){Console.WriteLine("ITest1接口的Test1()方法");}public void Test2(){Console.WriteLine("ITest2接口的Test2()方法");}}

3.3 显式接口成员实现

说明

如果类实现两个接口,并且两个接口包含具有相同签名的成员,那么在类中实现该成员将导致两个接口都使用该成员作为他们的实现。
这样可能会导致接口实现的不正确,因此需要显示实现接口成员,即创建一个仅通过该接口调用并且特定于该接口的类成员。
显示接口实现是通过 使用 接口名称和一个句点 命名该类成员来进行实现。

注意

显示接口成员实现中 不能包含 访问修饰符、abstract、virtual、override或static修饰符。
显示接口成员属于接口的成员,而不是类的成员你,因此,不能使用类对象直接访问,只能通过接口对象来访问。

示例

    interface ImyInterface1{int Add();}interface ImyInterface2{int Add();}class My_Class : ImyInterface1, ImyInterface2{int ImyInterface2.Add() { return 1; }int ImyInterface1.Add() { return 0; }}internal class Program{static void Main(string[] args){My_Class myClass = new My_Class();//myClass对象中不包含Add方法,只能通过实例化接口对象来调用Add方法ImyInterface1 imyInterface1 = myClass;Console.WriteLine($"调用接口ImyInterface1 中的Add方法结果为: {imyInterface1.Add()}");//将myClass作为ImyInterface2,来调用其中的Add()方法Console.WriteLine($"调用接口ImyInterface2 中的Add方法结果为: {(myClass as ImyInterface2).Add()}");Console.ReadLine();}}

运行结果:
运行结果

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 外键使用详解

1、MySQL 外键约束语法 MySQL 支持外键,允许在表之间进行相关数据的交叉引用,并有助于保持相关数据的一致性。 一个外键关系涉及到一个父表,该父表保存初始列值,和一个子表,子表的列值引用父表的列值。外键约束定义在…

C++ deque底层原理

deque底层原理 一、目的二、底层实现三、原理图四、类结构五、push_back六、pop_back 一、目的 实现双端数组 二、底层实现 双向开口的连续线性空间 三、原理图 四、类结构 class deque : protected Deque base _Deque_base._Deque_impl M_map 指针数组 _M_map_size …

React笔记(九)RTK

一、RTK的简介 1、官网地址 Redux Toolkit: 概览 | Redux 中文官网 2、Redux toolkit是什么 Redux Toolkit 是 Redux 官方强烈推荐,开箱即用的一个高效的 Redux 开发工具集。它旨在成为标准的 Redux 逻辑开发模式,我们强烈建议你使用它。 它包括几个…

行业追踪,2023-08-29

自动复盘 2023-08-29 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

【原创】H3C路由器OSPF测试

网络拓扑图 路由器配置: 路由器1上接了4跟线,分别为这四个接口配置IP地址。 # interface GigabitEthernet0/0/0port link-mode routecombo enable copperip address 2.1.1.2 255.255.255.0 # interface GigabitEthernet0/0/1port link-mode routecombo…

Linux知识点 -- 网络编程套接字

Linux知识点 – 网络编程套接字 文章目录 Linux知识点 -- 网络编程套接字一、预备知识1.认识端口号2.套接字3.TCP协议与UDP协议4.网络字节序 二、socket编程接口1.socket常见API2.sockaddr结构 三、UDP套接字编程1.直接打印客户端信息2.执行客户端发来的指令3.多用户聊天4.在wi…

ThreadLocal内存泄露分析

目录 1 ThreadLocal快速入门使用2 ThreadLocal内存泄露3 如何避免内存泄露 1 ThreadLocal快速入门使用 ThreadLocal介绍和应用:https://blog.csdn.net/ZGL_cyy/article/details/125958690 2 ThreadLocal内存泄露 如果创建对象较大gc,ThreadLocal是个弱…

Qt QtCreator 所有官方下载地址

Qt QtCreator 所有版本官方下载地址 1.所有版本QT下载地址 : Index of /archive/qt 所有Qt Creator下载地址: Index of /archive/qtcreator 所有Qt VS开发插件下载地址: Index of /archive/vsaddin 4.Qt官网镜像下载地址: Index of /…

HTTP 常⻅的状态码有哪些,以及适⽤场景

⼀、HTTP状态码 HT T P 状态码( HT T P S t a t u s Co d e )是⽤来表示⽹⻚服务器超⽂本传输协议响应状态的 3 位数字代 码。它由 RFC 2 6 1 6 规范定义,并得到 RFC 2 5 1 8 、 RFC 2 8 1 7 、 RFC 2 2 9 5 、 RFC 2 7 7 4 与 RFC 4 9 1 8…

Unity制作下雨中的地面效果

Unity引擎制作下雨效果 大家好,我是阿赵。   之前介绍了Unity引擎里面通过UV偏移做序列帧动画的做法,这里再介绍一个进阶的用法,模拟地面下雨的雨点效果。 一、原理 最基本的原理,还是基于这个序列帧动画的做法。不过这里做一点…

关于使用RT-Thread系统读取stm32的adc无法连续转换的问题解决

关于使用RT-Thread系统读取stm32的adc无法连续转换的问题解决 今天发现rt系统的adc有一个缺陷(也可能是我移植的方法有问题,这就不得而知了!),就是只能单次转换,事情是这样的: 我在stm32的RT-T…

Ubuntu tmux 默认安装 快捷键

安装 sudo apt install tmux 启动tmux tmux 注意下方已显示[0] 0:bash 左右分屏 依次输入两组快捷键:Ctrlb, Shift5 即:% 上下分屏 依次输入两组快捷键:Ctrlb, Shift 即:" 切换窗口(注意:鼠标点击没有切换效果&#x…

【USRP】产品型号、参数、架构全解析系列 6:N320 / N321

一、USRP 简介 通用软件无线电外设( USRP ) 是由 Ettus Research 及其母公司National Instruments设计和销售的一系列软件定义无线电。USRP 产品系列由Matt Ettus领导的团队开发,被研究实验室、大学和业余爱好者广泛使用。 大多数 USRP 通过以太网线连接到主机&am…

Ubutnu python2与python3切换

python -V #查看默认版本 Python 2.7.17 python3 -V #查看电脑3的版本 Python 3.6.9 sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 2 #设置两个版本的…

Emmet 使用笔记小结

Emmet 使用笔记小结 最近在跟视频走 CSS 的教程,然后要写很多的 HTML 结构,就想着总结一下 Emmet 的语法。 Emmet 是一个工具可以用来加速 HTML 和 CSS 的开发过程,不过 emmet 只支持 HTML & XML 文件结构,所以我个人觉得对…

【每日一题】54. 螺旋矩阵

54. 螺旋矩阵 - 力扣(LeetCode) 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5…

基于springboot实现了后台定时统计数据报表并将数据生成excel文件作为附件,然后通过邮件发送通知的功能

概述 本例子基于springboot实现了后台定时统计数据报表并将数据生成excel文件作为附件,然后通过邮件发送通知的功能。 详细 一、准备工作 1、首先注册两个邮箱,一个发送邮箱,一个接收邮箱。 2、发送邮箱开启IMAP/SMTP/POP3服务&#xff0c…

【面试题精讲】MySQL中覆盖索引是什么

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 系列文章地址 在MySQL中,覆盖索引是一种特殊类型的索引,它包含了查询所需的所有列,而不仅仅是索引列…

【Css】Less和Sass的区别:

文章目录 一、定义:【1】Less【2】Sass 二、相同之处:三、区别:【1】实现方式:【2】实现方式:【3】混合(Mixins):【4】解析方式:【5】变量的作用域:【6】比起Less 一、定义: 【1】Less Less 是…

MATLAB 2022b 中设置关闭 MATLAB 之前进行询问

在 MATLAB 2022b 中可以进行设置,在关闭 MATLAB 之前进行询问,防止意外关闭 MATLAB。如图: