20250530-C#知识:抽象类、抽象方法、接口

article/2025/7/5 14:07:23

C#知识:抽象类、抽象方法、接口

在开发过程中接口一般用得较多,程序框架往往定义一堆接口规范,然后程序员自己写逻辑来实现接口功能。掌握接口的知识还是很有必要的。


1、抽象类

  • 用abstract关键字修饰的类
  • 不能用来实例化对象
  • 可以包含抽象方法及普通方法,声明抽象方法时要加上abstract关键字
  • 继承抽象类必须重写其所有抽象方法
  • 抽象类变量容器可以装载子类对象
  • 抽象类主要是用来定义类规则的,子类来定义具体实现
    //动物就适合定义为抽象类,因为世界上并不存在名字叫动物的生物abstract class Animal{public string name;public Animal() { this.name = ""; }public Animal(string name) => this.name = name;public abstract void Eat();}

2、抽象方法

  • 用abstract修饰的方法
  • 只能在抽象类中声明
  • 在抽象类中声明的抽象方法没有方法体语句块
  • 不能是private,可以是protected
  • 继承抽象类的子类必须重写父类的抽象方法,加上override关键字
public abstract void Eat();

3、virtual方法 VS abstract方法

  • 两者都可以被子类无限重写
  • virtual方法可以有方法体,但abstract方法没有
  • 子类可以不重写父类的virtual方法,但必须重写父类的abstract方法

4、接口

  • 用interface关键字,与类声明类似
  • 接口本质是一组行为的规范
  • 接口不能实例化对象,但是可以用接口容器变量装载子类对象
    interface IMove2{void Move();}
  • 可以继承多个接口

  • 接口中不能包含成员变量

  • 接口只包含方法、属性、索引器、事件,子类必须实现接口中所有成员

  • 接口中的成员没有实现,具体实现由实现接口的类来完成

  • 接口可以继承接口

  • 接口中成员可以不加访问修饰符,只能是public的*

  • 类继承接口后,必须实现接口中所有成员,且访问权限为public

  • 接口继承接口本质是行为规范的合并,不用实现接口中的方法

  • 实现接口的方法,可以加上virtual关键字在子类中重写

  • 接口命名规范一般是IXxx

  • 接口中的方法可以重载,子类必须实现所有重载方法

    interface IMove{float Speed{get;set;}float this[int idx] { get;set;}void Move();void Move(float speed);Action MyEvent();}

5、显式实现接口

  • 若同时继承多个接口,接口中有同名方法,则需要显式实现接口
  • 显式实现接口不能写访问修饰符
  • 语法为:接口名.方法名
    class BadPlane : IMove, IMove2{void IMove.Move(){Console.WriteLine("一号龟速飞行");}void IMove2.Move(){Console.WriteLine("2号龟速飞行");}}
            IMove badPlane = new BadPlane();IMove2 badPlane2 = new BadPlane();badPlane.Move();    //一号龟速飞行badPlane2.Move();   //2号龟速飞行

6、接口VS抽象类

  • 可以实现多个接口、但只能继承一个抽象类
  • 接口中的方法都是抽象方法,抽象类可以包含抽象方法和普通方法
  • 接口中的方法默认访问权限为public,而抽象类中的方法必须加上访问修饰符
  • 接口不能有成员变量、构造函数,而抽象类可以有
  • 重写抽象方法要加override关键字,而实现接口方法不用
  • 优先组合而非继承,尽量用接口定义行为,避免复杂的类继承

7、完整代码示例:

namespace LearnAbstractAndinterface
{//飞机和人有移动方法,但是飞机和人之间没有继承关系,这里就可以用接口interface IMove{float Speed{get;set;}float this[int idx] { get;set;}void Move();void Move(float speed);Action MyEvent();}interface IMove2{void Move();}//动物就适合定义为抽象类,因为世界上并不存在名字叫动物的生物abstract class Animal{public string name;public Animal() { this.name = ""; }public Animal(string name) => this.name = name;public abstract void Eat();}class Person : Animal, IMove{public float Speed { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }public float this[int idx] { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }public Person() => this.name = "张飞";public Person(string name):base(name) { }public void Move(){Console.WriteLine("步行");}public override void Eat(){Console.WriteLine("吃隆江猪脚饭");}public void Move(float speed){throw new NotImplementedException();}public Action MyEvent(){throw new NotImplementedException();}}class Rabbit : Animal, IMove{public float Speed { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }public float this[int idx] { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }public Rabbit() => this.name = "流氓兔";public Rabbit(string name) : base(name) { }public void Move(){Console.WriteLine("跳");}public override void Eat(){Console.WriteLine("吃胡萝北");}public void Move(float speed){throw new NotImplementedException();}public Action MyEvent(){throw new NotImplementedException();}}class Plane : IMove{public float this[int idx] { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }public float Speed { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }public virtual void Move(){Console.WriteLine("飞行");}public void Move(float speed){throw new NotImplementedException();}public Action MyEvent(){throw new NotImplementedException();}}class GoodPlane: Plane,IMove2{public override void Move(){Console.WriteLine("一号光速飞行,免费");}void IMove2.Move(){Console.WriteLine("2号光速飞行,免费");}}class BadPlane : IMove, IMove2{public float this[int idx] { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }public float Speed { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }void IMove.Move(){Console.WriteLine("一号龟速飞行");}void IMove2.Move(){Console.WriteLine("2号龟速飞行");}public void Move(float speed){throw new NotImplementedException();}public Action MyEvent(){throw new NotImplementedException();}}internal class Program{static void Main(string[] args){Animal person = new Person();Animal rabbit = new Rabbit();person.Eat();   //吃隆江猪脚饭rabbit.Eat();   //吃胡萝北IMove person2 = new Person();   IMove rabbit2 = new Rabbit();IMove plane = new Plane();IMove goodPlane = new GoodPlane();person2.Move(); //步行rabbit2.Move(); //跳plane.Move();   //飞行goodPlane.Move();   //一号光速飞行,免费IMove2 goodPlane2 = new GoodPlane();IMove badPlane = new BadPlane();IMove2 badPlane2 = new BadPlane();goodPlane2.Move();  //2号光速飞行,免费badPlane.Move();    //一号龟速飞行badPlane2.Move();   //2号龟速飞行}}
}

8、参考资料

  1. 《唐老狮C#》

本篇结束,感谢您的阅阅阅阅阅阅读~

在这里插入图片描述


http://www.hkcw.cn/article/xkwTIVvuBF.shtml

相关文章

韩国首尔一地铁车厢内遭纵火 乘客被紧急疏散

当地时间5月31日8时47分左右,韩国首尔地铁5号线一辆列车车厢内起火,乘客随后被紧急疏散。据初步调查,火灾原因为有人纵火,嫌疑人已被抓获。目前暂无人员伤亡报告。受火灾事件影响,该地铁线路部分区段一度暂停运行,首尔市交通部门10时13分通报,事故处理已经完毕,暂停运行…

跨平台浏览器集成库JxBrowser 支持 Chrome 扩展程序,高效赋能 Java 桌面应用

JxBrowser 是 TeamDev 开发的跨平台库,用于在 Java 应用程序中集成 Chromium 浏览器。它支持 HTML5、CSS3、JavaScript 等,具备硬件加速渲染、双向 Java 与 JavaScript 连接、丰富的事件监听等功能,能处理网页保存、打印等操作,助…

聊聊网络变压器的浪涌等级标准是怎样划分的呢?

Hqst盈盛(华强盛)电子导读:聊聊网络变压器的浪涌等级标准是怎样划分的呢? 在和做防雷产品的客户的深度沟通网络变压器产品选型中发现:客户对网络变压器的浪涌等级划分也很希望有更深的了解,今天就这个问题和…

探索Air780EPM:N种GPIO控制LED的创新应用!

通过创新思维与实用技巧,本文将带你了解Air780EPM如何通过GPIO实现LED控制的N种可能,从简单到复杂,激发项目灵感。 一、GPIO直接驱动LED 1.1 适用场景 低功耗场景:LED电流 ≤ 5mA(普通GPIO的驱动能力限制)…

JS 事件循环详解

JS 事件循环详解 文章目录 JS 事件循环详解一、JS 的单线程模型与异步机制二、事件循环的核心组件1. 执行栈(Call Stack)2. 任务队列(Task Queue)3. Web APIs 三、事件循环的执行流程四、任务类型详解1. 宏任务(Macrot…

堆遇到的stl与理论基础

目录 二叉完全搜索树是堆吗:并不是,堆比两孩子都大 1. 二叉完全搜索树的特点 2. 堆的特点 3. 两者的主要区别 4. 结论 c有swap吗 堆的向上调整和向下调整是什么 1. 堆的定义 2. 向上调整(Heapify Up) 操作步骤 示例(最大堆&#x…

年度工作汇报工作总结PPT模版分享

年度工作汇报工作总结PPT模版分享:工作总结汇报类PPT模版https://pan.quark.cn/s/774660cc70e8

一文学会c++中的内存管理知识点

文章目录 c/c内存管理c语言动态内存管理c动态内存管理new/delete自定义类型妙用operator new和operator delete malloc/new,free/delete区别 c/c内存管理 int globalVar 1;static int staticGlobalVar 1;void Test(){static int staticVar 1;int localVar 1;in…

ZC-OFDM雷达通信一体化减小PAPR——直接限幅法

文章目录 前言一、直接限幅法技术1、简介2、原理 二、MATLAB 仿真1、核心代码2、仿真结果 三、资源自取 前言 在 OFDM 雷达通信一体化系统中,信号的传输由多个子载波协同完成,多个载波信号相互叠加形成最终的发射信号。此叠加过程可能导致信号峰值显著高…

【二维数组】

二维数组 需要掌握的知识二维数组与内存二维数组语法Arrays类的常用方法介绍如何实现冒泡排序 需要掌握的知识 二维数组与内存 二维数组语法 //数据类型【】【】数组; //或者 //数据类型 数组名【】【】; //二维数组初始化操作 int [][] scorenew int[][]{{90,85,92…

小黑大语言模型通过设计demo进行应用探索:langchain中chain的简单理解demo

chain简介 LangChain 中的 Chain 模块‌在开发大型语言模型(LLM)驱动的应用程序中起着至关重要的作用。Chain是串联LLM能力与实际业务的关键桥梁,通过将多个工具和模块按逻辑串联起来,实现复杂任务的多步骤流程编排。 案例 通过…

职坐标精选嵌入式AI物联网开源项目

随着嵌入式、AI与物联网技术的深度融合,开源生态已成为开发者构建智能硬件解决方案的核心驱动力。本文将从嵌入式实时操作系统、多模态AI数据集及物联网接入平台三大维度切入,系统性梳理技术选型要点与实践路径。在嵌入式领域,重点解析低功耗…

闻晓医考---口腔执业医师483分的复习攻略

🌈分清考试主次 🎆核心: 口外(114分) 口修(112分) 牙体牙髓(72分) 🎆重点: 口预(50分) 临床医学(49分) 口组病(33分) 口解(33分) 牙周(30分) 🎆次重点: 儿口(16分) 口腔黏膜(16分) 免疫(8分)…

火语言UI组件--幻灯片

【组件功能】:在有限空间内,循环播放同一类型的图片、文字等内容。 样式预览 基础设置 属性名称属性释义输入值类型初始索引(initialIndex)设置初始状态激活的幻灯片的索引,从 0 开始数字型(Number)触发方式(trigger)设置指示器的触发方式(…

矿用电液控连接器LCFB-12钢丝编织橡胶护套连接器

矿用电液控连接器LCFB-12钢丝编织橡胶护套连接器是煤矿井下综采工作面液压支架电液控制系统中的关键部件,其性能直接关系到整个液压系统的稳定性和安全性。随着智能化采矿技术的快速发展,这类连接器的技术要求和应用场景也在不断升级。本文将从产品结构、技术特点、行业应用及…

基于CAPL的DDS子消息解析- Data

1往期回顾 通过《DDS—RTPS一致性测试案例分析》一文,我们了解到 Data 子消息在 Data Distribution Service(DDS) 通信中扮演着至关重要的角色。它不仅负责 DDS 实体的 Simple Participant Discovery Protocol (SPDP) 发现流程,还参与了 Simple Endpoin…

MySQL之数据库的内嵌函数和联合查询

MySQL之数据库的内嵌函数和联合查询 一.数据库的内嵌函数1.1聚合函数1.2日期函数1.3字符串处理函数1.4 数学函数1.5其他常用的函数 二.联合查询2.1笛卡尔积2.2内连接2.3外连接2.4 自连接2.5子查询2.6合并查询 一.数据库的内嵌函数 1.1聚合函数 在MySQL中有着一类聚合函数来方…

【AUTOSAR OS】内存保护模块技术解析

一、模块总体功能概述 Os_Mprot.c 是AUTOSAR Classic Platform(CP)中内存保护模块的核心实现,主要负责验证任务(Task)和中断服务程序(ISR)对内存区域的访问权限,确保系统资源的合法使用。其核心功能包括: 内存访问权限校验:根据任务/中断所属的应用(App)信任级别(…

Docker 跨平台支持:从 Linux 到 macOS 的容器化开发实践

Docker 容器的理念是“一次构建,处处运行”,旨在解决应用程序在不同环境中部署的兼容性问题。然而,这一承诺的实现,在非原生 Linux 系统(如 macOS 和 Windows)上,需要巧妙的底层机制来支撑。 对于开发者而言,理解 Docker Desktop 在这些操作系统上的工作原理,特别是其…

电机试验平台:现代科技与工程应用的典范

电机试验平台作为电机行业中至关重要的一环,扮演着起着举足轻重的角色。随着科技的进步和工程技术的不断发展,电机试验平台也在不断创新和完善。本文将从电机试验平台的基本概念、发展历程、技术特点以及未来趋势等方面展开介绍。通过深入探讨&#xff0…