C#中实现接口的一些小知识(C#用abstract或virtual来实现接口成员)

文章目录

  • 不可用的修饰
  • 可用的修饰
    • 非抽象类实现接口
    • 抽象类实现接口
    • 抽象类与接口方法同名时一同实现

不可用的修饰

在C#中实现接口时,我们不能直接使用staticconst来实现接口成员,因为接口中的成员默认都是实例成员,并且它们表示一种契约,要求任何实现该接口的类都必须提供这些成员的具体实现。

可用的修饰

我们可使用关键字virtual或abstract来实现接口成员。

非抽象类实现接口

当一个非抽象类实现接口时,它必须为接口的所有成员提供具体实现,而这些方法可以直接实现或者通过virtual关键字使其成为虚方法,以便派生类可以进一步重写(override)它们。

using System;
// 定义一个接口
interface IAnimal
{
    void Eat();
    void Sleep();
}

// 非抽象类实现接口
class Cat : IAnimal
{
    // 同时作为接口成员实现和虚方法,允许派生类进行覆盖
    public virtual void Eat()
    {
        Console.WriteLine("猫正在吃东西");
    }

    // 实现接口的Sleep方法,这里也用virtual关键字,不过不是必须的
    public virtual void Sleep()
    {
        Console.WriteLine("猫正在睡觉");
    }
}

// 派生类覆盖Eat方法
class Kitten : Cat
{
    public override void Eat()
    {
        Console.WriteLine("小猫正在喝奶");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Kitten myKitten = new Kitten();
        ((IAnimal)myKitten).Eat(); // 输出 "小猫正在喝奶"
        myKitten.Sleep(); // 输出 "猫正在睡觉"
    }
}

运行结果如下所示,Cat类是一个非抽象类,它实现了IAnimal接口。尽管在非抽象类中,接口方法默认已经是实例方法,但我们仍然可以使用virtual关键字声明Eat和Sleep方法为虚方法,这样它们就可以被派生类Kitten覆盖。
Kitten类继承自Cat类,并覆盖了Eat方法以提供特定于小猫的行为。即使Eat方法在基类中既是接口实现又是虚方法,这并不影响它在派生类中的覆盖行为。:
在这里插入图片描述

抽象类实现接口

在抽象类(abstract class)中实现接口时,如果抽象类选择部分实现接口(也就是只提供部分成员的实现),那么未实现的接口成员可以在抽象类中声明为abstract,这样就强制所有继承自这个抽象类的子类去实现那些接口的未实现成员。

using System;
// 定义一个接口
interface IAnimal
{
    void Eat();
    void Sleep();
}

// 抽象类实现接口,部分成员使用abstract关键字让子类去实现
abstract class AnimalBase : IAnimal
{
    public abstract void Eat(); // 这是抽象方法,需要子类实现

    // 实现接口的Sleep方法
    public virtual void Sleep()
    {
        Console.WriteLine("动物正在睡觉");
    }
}

// 具体的子类,必须实现父类中未实现的抽象接口方法
class Dog : AnimalBase
{
    public override void Eat()
    {
        Console.WriteLine("狗正在吃东西");
    }

    // 可以选择覆盖父类中的虚方法
    public override void Sleep()
    {
        Console.WriteLine("狗正在打盹儿");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Dog myDog = new Dog();
        myDog.Eat(); // 输出 "狗正在吃东西"
        myDog.Sleep(); // 输出 "狗正在打盹儿"
    }
}

实现结果如下图所示,AnimalBase是一个抽象类,它实现了IAnimal接口。其中Eat方法被声明为abstract,意味着所有继承自AnimalBase的类都必须提供这个方法的具体实现。
同时,Sleep方法在AnimalBase中提供了默认实现,并通过virtual关键字使其成为可覆盖的虚方法。在派生类Dog中,我们选择了覆盖Sleep方法以提供更具体的实现。
在这里插入图片描述

抽象类与接口方法同名时一同实现

在非抽象类中,如果一个方法同时是接口实现也是基类虚方法或抽象方法(即用virtualabstract修饰),这并不影响它作为接口成员的实现,也就是说,你只需要实现这个方法,那么就相当于同时实现了接口和抽象类(或虚方法),同时也允许派生类进行覆盖。

using System;
// 定义一个接口
interface IAnimal
{
    void Eat();
    void Sleep();
}

// 抽象类Cat,包含与接口IAnimal.Eat同名的抽象方法
abstract class Cat
{
    // 与接口IAnimal中的Eat方法标签一致,声明为抽象方法
    public abstract void Eat();
    public abstract void Sleep();
}

// 基类KittyCat 继承自抽象类Cat并实现接口IAnimal
class KittyCat : Cat, IAnimal
{
    // 实现抽象类Cat中未实现的Eat方法,同时也满足了接口IAnimal的要求
    public override void Eat()
    {
        Console.WriteLine("小猫正在吃东西");
    }
    public override void Sleep()
    {
        Console.WriteLine("小猫正在打盹儿");
    }
}

class Program
{
    static void Main(string[] args)
    {
        KittyCat myKitty = new KittyCat();
        ((IAnimal)myKitty).Eat(); // 输出 "小猫正在吃东西"
        myKitty.Sleep(); // 输出 "小猫正在打盹儿"
    }
}

运行结果如下所示:

在这里插入图片描述

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

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

相关文章

每日学习总结20240308

每日总结 20240305 常用控件 QPushButton(按钮):用于触发操作或响应用户点击事件。QLabel(标签):用于显示文本或图像。QLineEdit(行编辑器):单行文本输入框&#xff0…

Python学习笔记-Flask实现简单的抽奖程序(增加图片显示)

1.创建static文件夹,存放图片文件 2.hero列表数据更改为要抽奖的图片名 3.html中可以编写python语句,遍历hero列表内容渲染到表格中 4.在点击随机抽取后,可以获得名称,然后使用img标签,将获取的名称拼接到路径中 3.初始页面,访问127.0.0.1:5000/index 4.点击随机抽取后 5.py…

方阵的特征值与特征向量

目录 特征值 & 特征向量 相关性质 特征值 & 特征向量 相关性质

java(框架) springboot-1 基础使用+mybaits使用

学习视频:b站黑马java教程 tomcat spring-boot工程内嵌了tomcat服务器 所有请求经过DispatcherServlet(实现servlet接口的类)(核心控制器/前端控制器)处理,再通过DispatcherServlet转发给各个controller。 最后通过DispatcherServlet给浏览器响应数据…

3D数字孪生运行不起来?该检查你的电脑配置了

运行3D数字孪生项目通常需要一定的计算资源和图形处理能力。以下是一些常见的电脑配置要求,可以作为参考:1处理器(CPU):推荐使用多核心处理器,如Intel Core i7或更高级别的处理器。较高的时钟频率和较大的缓…

RocketMQ的事务消息是如何实现的?

RocketMQ的事务消息是通过 TransactionListener接口来实现的。 在发送事务消息时,首先向RocketMQ Broker 发送一条‘half消息’(半消息),半消息将被存储在broker端的事务消息日志中,但是这个消息还不能被消费者消费。 接下来,在半消息发送成功后,应用程序通过执行本地事务…

msvcr110.dll丢失的5种修复方法,快速修复msvcr110.dll缺失问题

MSVCR110.dll文件的丢失可能会引发一系列的问题与不便,严重影响到用户的计算机使用体验。首先,由于MSVCR110.dll是Microsoft Visual C Redistributable Package的一部分,它的缺失可能导致许多基于此运行库编译的应用程序无法正常启动或运行&a…

52. N 皇后 II

52. N 皇后 II 题目-困难难度1. 回溯 题目-困难难度 n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。 示例 1: 输入:n …

蓝桥杯集训·每日一题2024 (二分,双指针)

前言: 开学了,平时学习的压力也逐渐大起来了,不过还算可以接受,等到后面阶段考的时候就不一样了,我目前为了转专业退选了很多课,这些课我都需要花时间来刷绩点,不然保研就没有竞争力了。我自己会…

人工蜂群算法

人工蜂群算法 人工蜂群算法(Artificial Bee Colony Optimization,ABC)是一种基于蜜蜂觅食行为的优化算法,由土耳其学者Karaboga于2005年提出,算法模拟蜜蜂的采蜜行为对优化问题进行求解。 算法原理 ABC算法的核心思想是将优化问…

STM32基础--构建自己的固件库

CMSIS 标准及库层次关系 因为基于 Cortex 系列芯片采用的内核都是相同的,区别主要为核外的片上外设的差异,这些差异却导致软件在同内核,不同外设的芯片上移植困难。为了解决不同的芯片厂商生产的 Cortex 微控制器软件的兼容性问题&#xff0…

API可视化编排,提高API可复用率

在数字化时代,API(应用程序编程接口)已成为不同软件应用之间沟通的桥梁。然而,如何高效管理、编排和复用这些API,成为了企业和开发者面临的重要挑战。随着技术的不断进步,RestCloud API可视化编排应运而生&…

PCIE的TLP包的封包解包原理

前言:开始pcie项目之前需要知道,本次项目我们是使用现有的框架RIFFA框架去完成设计的,因此比起具体代码的含义,更注重框架的使用。在开始项目之前需要了解PCIE的组建包过程。 一、TLP包的基本格式: 1.1整体包结构概述…

01-DevOps代码上线-git入门及gitlab远程仓库

一、准备学习环境 10.0.0.71-gitlab 2c2g-20GB 10.0.0.72-jenkins 2c2g-20GB 10.0.0.73-sonarqube 1c1g-20GB 10.0.0.74-nexus 1c1g-20GB 10.0.0.75-dm 1c1g-20GB (模拟写代码服务器) 在centos系统中&…

2024 批量下载公众号文章内容/阅读数/在看数/点赞数/留言数/粉丝数导出pdf文章备份(带留言):公众号记忆承载近1500篇历史文章在线查看,找文章方便了

关于公众号文章批量下载,我之前写过很多文章: 视频更新版:批量下载公众号文章内容/话题/图片/封面/音频/视频,导出html,pdf,excel包含阅读数/点赞数/留言数 2021陶博士2006/caoz的梦呓/刘备我祖/六神读金…

微服务架构 | 多级缓存

INDEX 通用设计概述2 优势3 最佳实践 通用设计概述 通用设计思路如下图 内容分发网络(CDN) 可以理解为一些服务器的副本,这些副本服务器可以广泛的部署在服务器提供服务的区域内,并存有服务器中的一些数据。 用户访问原始服务器…

HNU-算法设计与分析-甘晴void学习感悟

前言 算法设计与分析,仅就课程而言,似乎是数据结构与算法分析的延续 教材使用: 课程 关于课程,橙学长讲的非常清晰,我深以为然。 HNUCS-大三课程概览-CSDN博客文章浏览阅读1.3k次,点赞5次,收…

JVM-垃圾收集底层算法实现

三色标记 背景描述 在并发标记的过程中,因为标记期间应用线程还在继续跑,对象间的引用可能发生变化,多标和漏标的情况就有可能发生。 如何解决上面的问题? 引入“三色标记” 意思就是,把Gcroots可达性分析遍历对象过程…

【北京迅为】《iTOP-3588开发板网络环境配置手册》第4章 开发板直连电脑配置方法(无线上网)

RK3588是一款低功耗、高性能的处理器,适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用,RK3588支持8K视频编解码,内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

qtvs2022工程cmakelist.txt添加QCharts模块

find_package(QT NAMES Qt5 COMPONENTS Core Gui Widgets OpenGL Concurrent Charts Sql Network REQUIRED) find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Gui Widgets OpenGL Charts Concurrent Sql Network REQUIRED)这里find_package只是设置搜索路径,为…