C# 接口(Interface)和抽象类(Abstract Class)区别和详细使用案例

文章目录

  • 区别:
    • 1. **定义**:
    • 2. **继承与实现**:
    • 3. **成员**:
    • 4. **目的**:
  • 使用示例:
    • - **接口使用场景**:
    • - **抽象类使用场景**:

在C#中,接口(Interface)和抽象类(Abstract Class)都是为了支持面向对象编程中的多态性和实现类之间的共同特性而设计的。它们的主要区别、使用场景以及举例说明如下:

区别:

1. 定义

  • 接口:接口是一个完全抽象的类型,它仅包含方法、属性、索引器、事件等成员的签名,但不提供任何实现。接口用interface关键字定义。
  • 抽象类:抽象类是一种可以包含抽象方法和/或具体方法及成员变量的类,它可以有自己的部分实现。抽象类用abstract关键字定义,并且不能直接实例化。

2. 继承与实现

  • 接口:一个类可以实现多个接口,通过:关键字后跟接口名称列表并使用implements关键字(在C#中只需:即可)。
    public class MyClass : IMyInterface1, IMyInterface2
    {
        // 实现接口的方法...
    }
    
  • 抽象类:一个类只能从一个抽象类派生(单继承),并且必须实现所有未实现的抽象方法,使用:关键字。
    public abstract class MyBaseClass
    {
        public abstract void AbstractMethod();
        public void ConcreteMethod() { ... } // 具体方法
    }
    
    public class MyDerivedClass : MyBaseClass
    {
        public override void AbstractMethod() {...} // 必须实现抽象方法
    }
    

3. 成员

  • 接口:接口中所有方法默认是抽象的,不允许有实例字段(变量),但是可以有属性,且属性必须声明为自动实现的属性(C# 8.0 及以上版本允许有静态和非抽象的实例属性)。
  • 抽象类:可以有抽象方法(没有实现)、具体方法(有实现)、字段、属性、构造函数(尽管不能实例化抽象类,但可以用于初始化子类的实例变量)。

4. 目的

  • 接口:主要用于定义一组行为规范,强调的是“这个对象能做什么”,实现接口的对象保证了具备特定功能的能力。
  • 抽象类:更多地用于表示类的层级结构和共享代码,它可以定义类的基本结构,同时约束子类必须实现某些功能,还可以包含一些共性的具体实现。

使用示例:

- 接口使用场景

假设有一个动物王国,需要定义飞翔、游泳、奔跑的行为,这时可以用接口来描述这些行为:

interface IFlyable
{
    void Fly();
}

interface ISwimable
{
    void Swim();
}

interface IRunable
{
    void Run(int distance);
}

class Bird : IFlyable, IRunable
{
    public void Fly() {...}
    public void Run(int distance) {...}
}

class Fish : ISwimable
{
    public void Swim() {...}
}

这里,BirdFish各自实现了符合其特性的接口。

- 抽象类使用场景

在动物园管理系统中,所有的动物都有名字和年龄,但具体的喂养方式可能因动物种类不同而异,此时可以使用抽象类:

abstract class Animal
{
    public string Name { get; set; }
    public int Age { get; set; }
    
    public abstract void Feed(); // 抽象方法,由子类实现
    
    protected void Log(string message) // 共享的具体方法
    {
        Console.WriteLine($"Animal: {Name}, Action: {message}");
    }
}

class Lion : Animal
{
    public override void Feed()
    {
        Log("Fed with meat");
    }
}

class Giraffe : Animal
{
    public override void Feed()
    {
        Log("Fed with leaves");
    }
}

这里,Animal抽象类提供了通用属性和一个抽象方法Feed,各个具体动物类如LionGiraffe根据自身特点实现了Feed方法。

python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述

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

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

相关文章

php通用后台开发框架源码

php通用后台开发框架源码 基于ThinkPHPBootstrap的快速后台开发框架。 基于Auth验证的权限管理系统,支持无限级父子级权限继承,父级的管理员可任意 增删改子级管理员及权限设置,支持单管理员多角色,支持管理子级数据或个人数据。 …

EL表达式(上)

EL表达式 1. EL表达式是干什么的&#xff1f; - Expression Language&#xff08;表达式语言&#xff09; - EL表达式可以代替JSP中的java代码&#xff0c;让JSP文件中的程序看起来更加整洁美观 - JSP中夹杂着各种java代码&#xff0c;例如<% java代码%>等&#xff0c;导…

c#让三个线程按照顺序执行

现实的例子 三个线程都是while&#xff08;true&#xff09;的循环体 A线程&#xff1a;采集数据 B线程&#xff1a;画曲线 C线程&#xff1a;存数据库 AutoResetEvent类 AutoResetEvent 是一个线程同步的类&#xff0c;它提供了一种机制&#xff0c;允许一个或多个线程等待直…

Android 12.0 通知--PendingIntent源码分析

结论: PendingIntent 是延迟触发的一种 Intent , 通过上图的过程看,PendingIntent 的执行,是一种跨进程通信.首先创建PendingIntent对象时,就把该对象定义到 ActivityManagerService, 到执行 PengdingIntent 动作时, 也是在 ActivityManagerService 找到 目标PengdingIntent, 从…

科研绘图(三)百分比堆叠线条图

百分比堆叠线条图是一种数据可视化工具&#xff0c;它结合了堆叠面积图和线条图的特点。在这种图表中&#xff0c;时间序列数据被分成几个部分&#xff0c;每个部分代表一个类别&#xff0c;所有类别的值加起来总和为100%。这种图的每个点的堆叠区域代表不同类别在特定时间点的…

TypeScript学习笔记、鸿蒙开发学习笔记

变量定义方式 # 变量声明 let msg: string douzi console.log(msg) let num: number 20 console.log(num) let end: boolean true console.log("end" end) let a: any 10 a douzi console.log(a) let p {name:"douzi",age:20} console.log(p.name)…

神经网络|张量tensor(待完善)

文章目录 tensor/张量什么是tensor&#xff1f;如何用代码实现tensortensor在神经网络中的应用 其他 tensor/张量 什么是tensor&#xff1f; 张量是用来探究一个点在各个切面&#xff08;一共三个切面&#xff09;和各个方向&#xff08;x&#xff0c;y&#xff0c;z三个方向&…

AI语音机器人的发展

第一代AI语音机器人具体投入研发的开始时间不太清楚&#xff0c;只记得2017年的下半年就已经开始接触到成型的AI语音机器人&#xff0c;并且正式商用。语音识别效果还不多&#xff0c;大多都是接入的科大讯飞或者百度的ASR。 2018年算是AI语音机器人的“青春期”吧&#xff0c;…

LVS 负载均衡群集

本章展示&#xff1a; 了解群集的结构与工作模式 了解 LVS 负载均衡群集原理 学会配置 NFS 共享服务 学会构建 LVS-NAT 负载均衡群集 1.1 LVS 群集应用基础 群集的称呼来自于英文单词“Cluster”&#xff0c;表示一群、一串的意思&#xff0c;用在服务器领域则表 示大量服务…

Docker五部曲之二:Docker引擎

文章目录 前言Docker引擎镜像管理容器管理容器运行前台运行和后台运行容器识别重启策略清除 容器日志 数据管理卷挂载创建和管理卷启动带有卷的容器通过Docker Compose使用卷使用只读卷备份、恢复和迁移卷 绑定挂载用绑定挂载启动一个容器Docker Compose使用绑定挂载使用只读绑…

数据仓库研发规范

数据仓库研发规范 本文将介绍数据仓库研发规范的阶段规划、角色职责和整体流程。 在大数据时代&#xff0c;规范地进行数据资产管理已成为推动互联网、大数据、人工智能和实体经济深度融合的必要条件。贴近业务属性、兼顾研发各阶段要点的研发规范&#xff0c;可以切实提高研…

DCP文件传输的重要性与应用

在数字时代&#xff0c;文件传输已成为商业运作中不可或缺的一环。随着企业越来越多地采用云基础设施和服务&#xff0c;有效地在云和团队之间传输大文件和数据集变得至关重要。在这一背景下&#xff0c;数据复制协议&#xff08;DCP&#xff09;文件传输应运而生&#xff0c;引…

学习Vue封装的过渡与动画总结

今天学习了Vue封装的过渡与动画&#xff0c;接下来说一下Vue是如何实现的&#xff0c;首先原生的方法是在style元素中给指定元素添加过渡的过渡或动画&#xff0c;但Vue就不需要直接获取到需要过渡或动画的元素&#xff0c;而是使用一个<transition>的标签来包裹住想要过…

K8s:Pod生命周期

我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期&#xff0c;它主要包含下面的过程&#xff1a; pod创建过程 运行初始化容器&#xff08;init container&#xff09;过程 运行主容器&#xff08;main container&#xff09; 容器启动后钩子&#xff08;post st…

Netty开发弹幕系统

用Nettywebsocket实现简单的web弹幕系统 服务端代码 1. pom依赖 <!-- Netty --><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.66.Final</version></dependency><!-- N…

基于opencv的指针式仪表的识别与读数

对于指针式仪表的识别与读数&#xff0c;可以通过以下步骤使用OpenCV实现&#xff1a; 读取图像&#xff1a;使用cv2.imread()函数读取要处理的仪表图像。 灰度转换&#xff1a;使用cv2.cvtColor()函数将彩色图像转换为灰度图像。这是因为灰度图像只有一个通道&#xff0c;便…

Nginx负载均衡以及常用的7层协议和4层协议的介绍

一、引言 明人不说暗话&#xff0c;下面来解析一下 Nginx 的负载均衡。需要有 Linux 和 Nginx 环境哈。 二、nginx负载均衡的作用 高并发&#xff1a;负载均衡通过算法调整负载&#xff0c;尽力均匀的分配应用集群中各节点的工作量&#xff0c;以此提高应用集群的并发处理能力…

flutter在windows环境搭建

下载flutter https://flutter.cn/docs/development/tools/sdk/releases 下载相应的版本 我放在C盘下&#xff1a; 环境变量 再加系统变量&#xff1a; PUB_HOSTED_URLhttps://pub.flutter-io.cn 如图 FLUTTER_STORAGE_BASE_URLhttps://storage.flutter-io.cn 完成

[自动驾驶算法][从0开始轨迹预测]:一、坐标和坐标系变换

既然要从0开始轨迹预测&#xff0c;那从哪开始写起呢&#xff1f;回想下自己的学习历程&#xff0c;真正有挑战性的不是模型结构&#xff0c;不是繁琐的训练和调参&#xff0c;而是数据的制作&#xff01;&#xff01;&#xff01; 笔者自认为不是一个数学基础牢固的人&#xf…

Photoshop 2024 (PS2024) v25 直装版 支持win/mac版

Photoshop 2024 提供了多种创意工具&#xff0c;如画笔、铅笔、涂鸦和渐变等&#xff0c;用户可以通过这些工具来创建独特和令人印象深刻的设计效果。增强的云同步&#xff1a;通过 Adobe Creative Cloud&#xff0c;用户可以方便地将他们的工作从一个设备无缝同步到另一个设备…