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

news2024/12/23 5:38:04

文章目录

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

不可用的修饰

在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(); // 输出 "小猫正在打盹儿"
    }
}

运行结果如下所示:

在这里插入图片描述

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

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

相关文章

【SpringMVC】快速体验 SpringMVC接收数据 第一期

文章目录 一、SpringMVC 介绍1.1 主要作用1.2 核心组件和调用流程理解 二、快速体验三、SpringMVC接收数据3.1 访问路径设置3.1.1 精准路径匹配3.1.2 模糊路径匹配3.1.3 类和方法级别区别3.1.4 附带请求方式限制3.1.5 进阶注解 与 常见配置问题 3.2 接收参数(重点&a…

C++ 智能指针深度剖析

文章目录 1. 前言2. 为什么需要智能指针?3. 内存泄漏3.1 内存泄漏的概念及危害3.2 内存泄漏的分类3.3 如何检测内存泄漏3.4 如何避免内存泄漏 4. 智能指针的使用及原理4.1 RAII思想4.2 智能指针的原理4.3 C智能指针发展历史4.4 std::auto_ptr4.5 std::unique_ptr4.6…

计算机组成原理之机器:存储器之辅助存储器

计算机组成原理之机器:存储器之辅助存储器 笔记来源:哈尔滨工业大学计算机组成原理(哈工大刘宏伟) Chapter3:存储器之辅助存储器 3.1 概述 3.2 磁记录原理 通不同方向电流时磁化方向不同,由此区分写入…

vue 使用谷歌地图 @googlemaps/js-api-loader 进行模糊搜索

<template><div class"map"><div class"mapLeftStyle"><el-inputv-model"input"placeholder"请输入内容"class"controls"input"chnageinput"><i slot"prefix" class"e…

2007-2022年上市公司迪博内部控制评价缺陷数量数据

2007-2022年上市公司迪博内部控制评价缺陷数量数据 1、时间&#xff1a;2007-2022年 2、范围&#xff1a;上市公司 3、指标&#xff1a;证券代码、证券简称、辖区、证监会行业、申万行业、是否存在财报内控重大缺陷、财报内控重大缺陷数量、是否存在财报内控重要缺陷、财报内…

Linux第73步_学习Linux设备树和“OF函数”

掌握设备树是 Linux驱动开发人员必备的技能&#xff01; 1、了解设备树文件 在3.x版本以前的Linux内核源码中&#xff0c;存在大量的“arc/arm/mach-xxx”和“arc/arm/plat-xxx”文件夹&#xff0c;里面很多个“.c”和“.h”文件&#xff0c;它们用来描述设备信息。而现在的A…

使用Portainer让测试环境搭建飞起来

Docker的用处不多加赘述&#xff0c;Docker目前有以下应用场景&#xff1a; 测试&#xff1a;Docker很适合用于测试发布&#xff0c;将 Docker 封装后可以直接提供给测试人员进行运行&#xff0c;不再需要测试人员与运维、开发进行配合&#xff0c;进行环境搭建与部署。 测试…

【考研数学】李林《880》vs 李永乐《660》完美使用搭配

没有说谁一定好&#xff0c;只有适不适合自身情况&#xff0c;针对自身弱点选择性价比才最高。 两者侧重点不同&#xff0c;660适合强化前期&#xff0c;弥补基础的不足&#xff0c;880适合强化后期&#xff0c;题型全面&#xff0c;提高我们对综合运用知识的能力。 选择习题…

动手学深度学习PyTorch版

基本的数据操作 import torch # 创建一个行向量&#xff0c;默认为从0开始的12个整数 # n维数组也称为张量 x torch.arange(12) x # 张量的形状 x.shape# 张量的大小,张量所有元素的个数 x.numel()#修改张量的形状 x x.reshape(3,4)#生成形状为3*4的两个向量&#xff0c;向…

C#实现归并排序算法

C#实现归并排序算法 以下是 C# 中的归并排序算法实现示例&#xff1a; using System;class MergeSortAlgorithm {// 合并两个子数组static void Merge(int[] arr, int left, int mid, int right){// 计算左子数组和右子数组的长度int n1 mid - left 1;int n2 right - mid;/…

力扣--滑动窗口438.找到字符串中所有字母异位词

思路分析&#xff1a; 使用两个数组snum和pnum分别记录字符串s和p中各字符出现的次数。遍历字符串p&#xff0c;统计其中各字符的出现次数&#xff0c;存储在pnum数组中。初始化snum数组&#xff0c;统计s的前m-1个字符的出现次数。从第m个字符开始遍历s&#xff0c;通过滑动窗…

STM32(14)USART

USART:一种片上外设&#xff0c;用来实现串口通信&#xff0c;就是stm32内部的串口 USART简介 串并转换电路 串行通信和并行通信 串行&#xff1a;一根数据线&#xff0c;逐个比特位发送 为什么要串并转换 移位寄存器 USART的基本模型 通过查询SR&#xff08;状态寄存器&…

w022郑州大学招新赛选拔赛

A-SW的与众不同数组_2022学年第一学期郑州大学ACM招新赛&选拔赛 (nowcoder.com) #include <bits/stdc.h> #define int long long using namespace std;void solve(){int n;cin >> n;vector<int> v;for(int i 1; i < n; i){int x;cin >> x;v.p…

Java集合面试题(day 02)

&#x1f4d1;前言 本文主要是【JAVA】——Java集合面试题的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&am…

一文扫荡,12个可视化图表js库,收藏备用。

hello&#xff0c;我是贝格前端工场&#xff0c;可视化图表在web前端开发中经常碰到&#xff0c;是不是很疑惑这些炫酷的图表是怎么实现的&#xff0c;其实是通过js库开发的&#xff0c;本文带来12个javascript库的介绍&#xff0c;欢迎关注我&#xff0c;阅读精彩内容。 一、什…

【新版Hi3521DV200处理器性能】

新版Hi3521DV200处理器性能 Hi3521DV200是针对多路高清/超高清&#xff08;1080p/4M/5M/4K&#xff09;DVR产品应用开发的新一代专业SoC芯片。Hi3521DV200集成了ARM Cortex-A7四核处理器和性能强大的神经网络推理引擎&#xff0c;支持多种智能算法应用。同时&#xff0c;Hi352…

Media Encoder 2024:未来媒体编码的新纪元 mac/win版

随着科技的飞速发展&#xff0c;媒体内容已成为我们日常生活中不可或缺的一部分。为了满足用户对高质量视频内容不断增长的需求&#xff0c;Media Encoder 2024应运而生&#xff0c;它凭借卓越的技术和创新的特性&#xff0c;重塑了媒体编码的未来。 Media Encoder 2024软件获…

绝赞春招拯救计划

huihut/interview: &#x1f4da; C/C 技术面试基础知识总结&#xff0c;包括语言、程序库、数据结构、算法、系统、网络、链接装载库等知识及面试经验、招聘、内推等信息。This repository is a summary of the basic knowledge of recruiting job seekers and beginners in t…

数据结构与算法-插值查找

引言 在计算机科学的广阔天地中&#xff0c;数据结构和算法扮演着至关重要的角色。它们优化了信息处理的方式&#xff0c;使得我们在面对海量数据时能够高效、准确地进行检索与分析。本文将聚焦于一种基于有序数组且利用元素分布规律的查找算法——插值查找&#xff08;Interpo…

活动预告|听云猿生数据创始人 CEO 曹伟分享云数据库行业十余年经验总结

3月16日&#xff0c;KubeBlocks 将携手 OceanBase 开源社区、AutoMQ 带来《LLMs 时代下的企业数据管理与降本增效之路》主题 meetup&#xff0c;扫描下方二维码&#xff0c;即刻报名&#x1f447;。 云猿生数据创始人 & CEO 曹伟将带来《KubeBlocks&#xff1a;把所有数据…