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

运行结果如下所示:

在这里插入图片描述

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

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

相关文章

c++的STL(2)-- vector容器

目录 1. 默认构造 代码: 相关知识点: 2. 有参构造函数 以及 使用{}初始化对象 代码: 相关知识点: 3. vector容器在尾部添加和删除元素 代码: 使用push_back()和pop_back()进行尾部元素的添加和删除 相关知识点: 代码: 使用emplace_back在尾部添…

人工蜂群算法

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

Mysql学习笔记之事务详解(读未提交、读以提交、可重复读、串行化读)

在这个博主的基础上,增加两种情况的对比:https://blog.csdn.net/llllllkkkkkooooo/article/details/108068919 可重复读中幻读现象(未使用MVCC) 设置可重复读的隔离级别 set global transaction isolation level repeatable read…

「解析文件流,Java之FileOutputStream助您轻松操作文件!」

🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!&#xf…

TCP重传机制、滑动窗口、拥塞控制

一、总述 TCP,Transmission Control Protocol,是一个面向连接、基于流式传输的可靠传输协议,考虑到的内容很多,比如数据包的丢失、损坏、分片和乱序等,TCP协议通过多种不同的机制来实现可靠传输。今天,重点…

复试人工智能前沿概念总结

1.大模型相关概念(了解即可) 1.1 GPT GPT,全称为Generative Pre-training Transformer,是OpenAI开发的一种基于Transformer的大规模自然语言生成模型。GPT模型采用了自监督学习的方式,首先在大量的无标签文本数据上进…

Android使用WebView打开内嵌H5网页

Android打开外部网页链接请参考上一篇文章 https://public.blog.csdn.net/article/details/136384559 继上篇,新建assets文章夹,将H5的网页资源放到此文件夹下 把H5的资源文件都拷进来 这个时候,将添加打开本地网页的代码: //打…

【活动】2024年AI辅助研发:深度变革与无限潜力

作为一名前端程序员,深入探讨2024年AI在软件研发领域的应用趋势及其影响,我们可以看到一场引人注目的转型正在发生。AI辅助研发对于前端开发而言,不仅意味着效率的飞跃,更是在用户体验设计、代码编写、性能优化、项目管理等诸多方…

Java零基础 - 数组的定义和声明

哈喽,各位小伙伴们,你们好呀,我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。 我是一名后…

httprunner用例结构(前后置)

说明:httprunner 结合 pytest 的前后置方式 1. 用例级别前后置 1.1. setup teardown class TestCaseRefTestcase(HttpRunner):# 用例级别前后置def setup(self):logger.warning("------用例级别前置")def teardown(self):logger.warning("------用…

在Vue中处理接口返回的二进制图片数据

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

Android使用WebView打开外部网页链接

发布Android应用,除了用原生开发外,更多是采用内嵌H5网页的方式来做,便于更新以及多平台使用。 一、第一种方式是直接通过WebView打开外部H5链接。 新建Android工程 直接创建一个工程,点击运行就可以了,打开是个空页…

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

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

打造禹州中医药大模型,以AI驱动业务创新(内附孙思邈GPT内测版)

大禹智库 第78 期(总第409 期) 2024年 3 月 4 日 在中医药传承与发展的关键时期,结合许昌市的地域特色和产业优势,大禹智库提出“打造禹州中医药大模型,以AI驱动业务创新”的战略构想。本报告围绕构建禹州中医药现代化…

旅游陪同翻译,英译中需要具备什么能力!

随着中国旅游业的蓬勃发展,越来越多的外国游客选择踏足这片充满魅力的土地。然而,语言障碍常常成为他们探索中国文化的绊脚石。在这时,旅游陪同翻译应运而生,为游客提供了便捷的语言沟通服务,让他们的旅程更加顺畅和愉…

河北省国际光伏展览会

能源是国民经济发展的重要基础之一。随着国民经济的发展,能源的缺口增大,能源安全及能源在国民经济中的地位越显突出。我国是世界上少数几个能源结构以煤为INVITATION主的国家之一,也是世界上最大的煤炭消费国,燃煤造成的环境污染…

云轴科技ZStack荣获证券基金行业信息技术应用创新联盟年度优秀成员奖

近日,由中国证监会科技监管司、上海市经济和信息化委员会及上交所理事会科技发展委员会指导,证券基金行业信息技术应用创新联盟(简称信创联盟)主办的2023年年度工作会议在上海成功举办。会议汇聚了来自监管机构、政府机构、行业侧…

Spring Cloud Gateway自定义断言

问题:Spring Cloud Gateway自带的断言(Predicate)不满足业务怎么办?可以自定义断言! 先看Spring Cloud Gateway是如何实现断言的 Gateway中断言的整体架构如下: public abstract class AbstractRoutePred…

【kerberos】hadoop集群使用keytab认证的逻辑

一、背景: haoop的kerberos认证核心是org.apache.hadoop.security.UserGroupInformation类。 UserGroupInformation一般有两种:(1)apache原生的(2)cdh hdp改良过的,即cloudera改良过的。 由此衍…