【C#补全计划:类和对象(九)】接口

一、接口的概念

1. 概念:接口是行为的抽象规范,也是一种自定义类型

2. 接口声明规范:

        (1)不包含成员变量

        (2)只包含属性、方法、索引器、事件

        (3)成员不能被实现

        (4)成员可以不写访问修饰符(默认public),不能是私有的

        (5)接口不能继承类,但是可以继承另一个接口

3. 接口使用规范

        (1)类可以继承多个接口

        (2)类继承接口后,必须实现接口中所有成员

4. 特点:

        (1)接口的声明和类的声明类似

        (2)接口是用来继承的

        (3)接口不能被实例化,但是可以作为容器存储对象

二、接口的声明

1. 关键字:interface

2. 语法:

interface 接口名

{

}

3. 作用:接口是抽象行为的“基类”

4. 命名规范:I + 帕斯卡命名

using System;namespace Interface
{interface IFly // 声明接口{int Height { // 成员属性不能被实现get; set;}int this[int index] { // 成员索引器不能被实现get; set;}void fly(); // 成员方法不能被实现}
}

三、接口的使用

1. 类可以继承一个父类,n个接口

2. 类继承接口后,必须实现接口中的所有内容,并且必须是public的

using System;namespace Interface
{interface IFly // 声明接口{int Height { // 成员属性不能被实现get; set;}int this[int index] { // 成员索引器不能被实现get; set;}void fly(); // 成员方法不能被实现}class Animal // 基类{string Name {get; set;}}// 类可以继承一个父类,n个接口// 类继承接口后,必须实现接口中的所有内容,并且必须是public的class Bird : Animal, IFly // 继承父类和接口{public int Height { // 实现接口属性get; set;}public int this[int index] { // 实现接口索引器get { return index; }set { }}public void fly() // 实现接口方法{Console.WriteLine("鸟用翅膀飞了" + Height + "米");}}
}

3. 实现的接口函数,可以加virtual再在子类重写

using System;namespace Interface
{interface IFly // 声明接口{int Height { // 成员属性不能被实现get; set;}int this[int index] { // 成员索引器不能被实现get; set;}void fly(); // 成员方法不能被实现}class Animal // 基类{string Name {get; set;}}// 类可以继承一个父类,n个接口// 类继承接口后,必须实现接口中的所有内容,并且必须是public的class Bird : Animal, IFly // 继承父类和接口{public int Height { // 实现接口属性get; set;}public int this[int index] { // 实现接口索引器get { return index; }set { }}// 实现的接口函数,可以加virtual再在子类重写public virtual void fly() // 实现接口方法{Console.WriteLine("鸟用翅膀飞了" + Height + "米");}}
}

4. 接口也遵循里氏替换原则

using System;namespace Interface
{interface IFly // 声明接口{int Height { // 成员属性不能被实现get; set;}int this[int index] { // 成员索引器不能被实现get; set;}void fly(); // 成员方法不能被实现}class Animal // 基类{string Name {get; set;}}// 类可以继承一个父类,n个接口// 类继承接口后,必须实现接口中的所有内容,并且必须是public的class Bird : Animal, IFly // 继承父类和接口{public int Height { // 实现接口属性get; set;}public int this[int index] { // 实现接口索引器get { return index; }set { }}// 实现的接口函数,可以加virtual再在子类重写public virtual void fly() // 实现接口方法{Console.WriteLine("鸟用翅膀飞了" + Height + "米");}}class Program{static void Main(string[] args){// 接口也遵顼里氏替换原则IFly f = new Bird();}}
}

5. 接口可以继承接口

using System;namespace Interface
{interface IFly // 声明接口{int Height { // 成员属性不能被实现get; set;}int this[int index] { // 成员索引器不能被实现get; set;}void fly(); // 成员方法不能被实现}interface IWalk // 声明第二个接口{void walk();}interface IMove : IFly, IWalk // 接口继承接口{void move(string value);}class Animal // 基类{string Name {get; set;}}// 类可以继承一个父类,n个接口// 类继承接口后,必须实现接口中的所有内容,并且必须是public的class Bird : Animal, IFly // 继承父类和接口{public int Height { // 实现接口属性get; set;}public int this[int index] { // 实现接口索引器get { return index; }set { }}// 实现的接口函数,可以加virtual再在子类重写public virtual void fly() // 实现接口方法{Console.WriteLine("鸟用翅膀飞了" + Height + "米");}}class Person : IMove{public int Height { // 实现接口属性get; set;}public int this[int index] { // 实现接口索引器get {return index;}set {}}public virtual void fly() // 实现接口方法{Console.WriteLine("人乘坐飞机飞了" + Height + "米");}public void walk() // 实现接口方法{Console.WriteLine("人用腿行走");}public void move(string value) // 实现接口方法{if(value == "fly") {fly();} else if(value == "walk") {walk();}}}class Program{static void Main(string[] args){// 接口也遵顼里氏替换原则IFly f = new Bird();// 都遵循里氏替换原则IMove move = new Person();IFly fly = new Person();IWalk walk = new Person();}}
}

四、显式实现接口

1. 作用:当一个类继承多个接口,而接口中存在同名方法时,使用显式实现接口

2. 语法:接口名.函数名() {}

3. 代码:

using System;namespace Interface
{interface IFly // 声明接口{int Height { // 成员属性不能被实现get; set;}int this[int index] { // 成员索引器不能被实现get; set;}void fly(); // 成员方法不能被实现}interface IWalk // 声明第二个接口{void walk();}interface IMove : IFly, IWalk // 接口继承接口{void move(string value);}class Animal // 基类{string Name {get; set;}}// 类可以继承一个父类,n个接口// 类继承接口后,必须实现接口中的所有内容,并且必须是public的class Bird : Animal, IFly // 继承父类和接口{public int Height { // 实现接口属性get; set;}public int this[int index] { // 实现接口索引器get { return index; }set { }}// 实现的接口函数,可以加virtual再在子类重写public virtual void fly() // 实现接口方法{Console.WriteLine("鸟用翅膀飞了" + Height + "米");}}class Person : IMove{public int Height { // 实现接口属性get; set;}public int this[int index] { // 实现接口索引器get {return index;}set {}}public virtual void fly() // 实现接口方法{Console.WriteLine("人乘坐飞机飞了" + Height + "米");}public void walk() // 实现接口方法{Console.WriteLine("人用腿行走");}public void move(string value) // 实现接口方法{if(value == "fly") {fly();} else if(value == "walk") {walk();}}}/*----------------------------------------------------------*/// 显式实现接口interface IAtk{void atk();}interface ISkill{void atk();}class Player : IAtk, ISkill // 实现多个接口{void IATK.atk() // 显式实现接口方法{Console.WriteLine("玩家普通攻击");}void ISkill.atk() // 显式实现接口方法{Console.WriteLine("玩家释放技能攻击");}}class Program{static void Main(string[] args){// 接口也遵顼里氏替换原则IFly f = new Bird();// 都遵循里氏替换原则IMove move = new Person();IFly fly = new Person();IWalk walk = new Person();}}
}

4. 注意:

        若使用子类容器,则无法调用显式实现接口的方法,需要转换尾父类容器。

using System;namespace Interface
{interface IFly // 声明接口{int Height { // 成员属性不能被实现get; set;}int this[int index] { // 成员索引器不能被实现get; set;}void fly(); // 成员方法不能被实现}interface IWalk // 声明第二个接口{void walk();}interface IMove : IFly, IWalk // 接口继承接口{void move(string value);}class Animal // 基类{string Name {get; set;}}// 类可以继承一个父类,n个接口// 类继承接口后,必须实现接口中的所有内容,并且必须是public的class Bird : Animal, IFly // 继承父类和接口{public int Height { // 实现接口属性get; set;}public int this[int index] { // 实现接口索引器get { return index; }set { }}// 实现的接口函数,可以加virtual再在子类重写public virtual void fly() // 实现接口方法{Console.WriteLine("鸟用翅膀飞了" + Height + "米");}}class Person : IMove{public int Height { // 实现接口属性get; set;}public int this[int index] { // 实现接口索引器get {return index;}set {}}public virtual void fly() // 实现接口方法{Console.WriteLine("人乘坐飞机飞了" + Height + "米");}public void walk() // 实现接口方法{Console.WriteLine("人用腿行走");}public void move(string value) // 实现接口方法{if(value == "fly") {fly();} else if(value == "walk") {walk();}}}/*----------------------------------------------------------*/// 显式实现接口interface IAtk{void atk();}interface ISkill{void atk();}class Player : IAtk, ISkill // 实现多个接口{void IAtk.atk() // 显式实现接口方法{Console.WriteLine("玩家普通攻击");}void ISkill.atk() // 显式实现接口方法{Console.WriteLine("玩家释放技能攻击");}}class Program{static void Main(string[] args){// 接口也遵顼里氏替换原则IFly f = new Bird();// 都遵循里氏替换原则IMove move = new Person();IFly fly = new Person();IWalk walk = new Person();Player player = new Player();// person.atk(); // 调用接口方法, 编译报错Console.WriteLine("转换为IATK类:");(player as IAtk)?.atk(); // 显式实现接口方法,调用时需要转换类型Console.WriteLine("转换为ISkill类:");(player as ISkill)?.atk(); // 显式实现接口方法,调用时需要转换类型}}
}

        至此,面向对象的三大特性之一:多态就学习完了。

        今天的学习就到这里了,感谢阅读。

        再见!

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

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

相关文章

SRS简介及简单demo

SRS介绍 SRS(Simple Realtimes Server)是一款开源的实时流媒体服务器,专注于解决直播、实时互动等场景的流媒体传输问题。SRS 的设计目标是 “简单、稳定、高效”,专门针对实时流媒体协议(如 RTMP、HLS、HTTP-FLV、WebRTC 等)进行优化,专注于解决 “低延迟、高并发” 的…

python基础:数据解析BeatuifulSoup,不需要考虑前端形式的一种获取元素的方法

1.beatuifulSoup 基本用法 beautifulSoup(简称bs4)是python的一个第三方库,用于解析html和xml文档中提取数据的python库。它能够将复杂的文档转化为树形结构,方便快速定位和提取所需数据以及查找和修改,常常与爬虫框架…

Ubuntu共享文件夹权限设置

在Ubuntu中设置共享文件夹的权限(只读、读写、无权限),主要通过两种方式实现:‌文件系统权限‌和‌Samba共享配置‌。以下是详细步骤:‌一、文件系统权限设置(基础权限)‌1. ‌修改文件夹所有权…

小程序点击菜单栏实现样式动态切换

小程序点击菜单栏背景样式动态切换 前言:今天做一个小程序项目,要做一个菜单栏动态切换的功能,因为这种需求很常见,这次干脆记录一下,帮助别人的同时,自己下次也可以直接照搬使用。 效果截图如下&#xff1…

掌握工程化固件烧录,开启你的技术进阶之路-FPGA ISE(xilinx)

1、电脑需先行安装ISE14.7。若已完成安装,此步骤可略过;若尚未安装,在后续章节会介绍如何安装ISE,由于ISE14.7的安装程序体量庞大,可借助U盘进行传输。同时,电脑需预留至少30G的存储空间以用于安装该程序。…

Android 之 面试八股文

​1.Activity生命周期​​​​问题​​:描述Activity从启动到销毁的完整生命周期方法,并说明onSaveInstanceState()的调用时机。​​参考答案​​:onCreate()→ onStart()→ onResume()(活跃状态) → onPause()&#x…

暴力解决MySQL连接失败

本文涉及清空root密码完全重置MySQL权限彻底卸载并重装MySQL请务必在测试/本地环境操作,生产环境慎用!场景Spring Boot项目连接MySQL一直报Access denied for user rootlocalhost,改密码、换驱动都没用?步骤1:完全重置…

前端开发:CSS(1)—— 什么是CSS?

本文用于记录前端开发的学习过程。前面我们已经学习了html的编写,知道了Web开发的一些最基本的知识;在html的学习过程中,我们提到关于样式的设计和修改常需要使用CSS来实现。那么CSS到底是什么东西呢?它又如何来设计样式呢&#x…

数据结构(4)—栈和队列

一、概念1.栈只允许在栈顶位置入栈和出栈元素,链表可以在任意位置插入和删除元素,栈和队列只允许在指定位置插入和删除元素2.链表、栈和队列都是一种线性结构(一对一),栈和队列是一种特殊的表状结构二、栈1.基础概念先…

vue2.如何给一个页面设置动态的name。不同路由使用一样的组件。页面不刷新怎么办?

page里面detail.vue export default { name: detail, } vue2里面.vue的页面都会设置一个name,这个通常是写死的。不能在页面动态设置的。页面刷新缓存通常都是根据这个name来判断的。如果name写死。我几个页面都通用这一个页面的话,他也不刷新页面啊。 比…

浮动IP(Floating IP)的删除通常需要满足什么条件

浮动IP(Floating IP)的删除通常需要满足什么条件在云计算或网络环境中,浮动IP(Floating IP)的删除通常需要满足一定的条件,以确保操作不会影响现有业务或导致网络中断。以下是常见的可删除浮动IP的场景和条…

机器学习之随机森林(Random Forest)实战案例

一、算法基础 首先,来介绍一下算法的基础语法 class sklearn.ensemble.RandomForestClassifier(\ n_estimators’warn’,\ criterion’gini’,\max_depthNone, \ min_samples_split2,\ min_samples_leaf1, \ min_weight_fraction_leaf0.0, \ max_features’auto’…

《C语言》指针练习题--1

《C语言》指针练习题–1 1. 交换两个整数的值 题目描述: 编写一个C程序,定义一个函数swap,使用指针参数交换两个整数的值。在main函数中调用该函数并输出交换后的结果。 解题思路: 为了交换两个整数的值,可以通过指针传…

应急响应整理

目录 windows下 1. 检查账号安全 利用注册表实现用户隐藏 粘滞键后门 2 检查异常端口、进程 3. 检查启动项、计划任务、服务 4. 日志分析-Windows 常见事件类型、登录类型 Linux下 1. 账号安全 2. 历史命令 3. 检查异常端口 4. 检查异常进程 5. 检查开机启动项 …

一文读懂 C# 中的 Bitmap

一文读懂 C# 中的 Bitmap 一、Bitmap 到底是什么? 二、推荐使用场景 三、实战 Demo 基础用法:加载、创建和保存 进阶用法 缩放图片 裁剪图片 颜色调整(反色处理) 四、核心方法和属性说明 常用函数 常用属性 五、避坑指南、注意事项 六、总结与决策 一文读懂 C# 中的 Bitmap…

预约时间组件

效果图如何使用<template><view><button click"pickerTime(0)">预约时间0</button><button click"pickerTime(1)">预约时间1</button><button click"pickerTime(2)">预约时间2</button><but…

Android 开发 - Service、Camera、Layout Design 自定义设备类型和大小

一、Service 启动 1、基本介绍 &#xff08;1&#xff09;startService()其他组件通过调用 startService() 启动 Service 后&#xff0c;Service 可在后台无限期运行&#xff0c;即使启动 Service 的组件被销毁也不受影响&#xff0c;一般情况下 startService() 是执行单一操作…

Qwen Image:开源中文渲染SOTA,重塑文生图技术边界

1. Qwen Image的技术定位与行业痛点1.1 文本渲染&#xff1a;文生图领域的长期技术瓶颈传统文生图模型在图像美学与真实感优化上已取得显著进展&#xff0c;但多语言文本渲染始终是行业难以突破的瓶颈。主流模型在处理中文等非字母语言时&#xff0c;常出现字符断裂、布局错位、…

Docker入门教程:在腾讯云轻量服务器上部署你的第一个容器化应用 (2025)

更多云服务器知识&#xff0c;尽在hostol.com“在我电脑上明明是好的啊&#xff01;”这句话&#xff0c;是不是堪称程序员“甩锅”排行榜第一名的金句&#xff1f;当你辛辛苦苦开发完一个应用&#xff0c;把它交给同事或者部署到服务器上时&#xff0c;却发现因为它依赖的某个…

DevOps平台结合Gradle实现打包流水线

在现代软件开发中,持续集成与持续交付(CI/CD)已成为团队提速、降本增效的核心实践。Gradle作为强大的自动化构建工具,常被用于Android与Java项目的构建打包任务。而将Gradle集成进企业的DevOps平台中,不仅可以标准化构建过程,还能自动化打包、测试、发布的全流程,大幅提…