当前位置: 首页 > news >正文

【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.lryc.cn/news/613579.html

相关文章:

  • 【Agent】ReAct:最经典的Agent设计框架
  • RP2040下的I2S Slave Out,PIO状态机(三)
  • 解决winform中的listbox实现拖拽时,遇到combox控件会闪烁的问题
  • 数据库事务总结
  • 嵌入式开发硬件——单片机
  • Mac 电脑安装 ADB 环境完整指南
  • windows操作系统定时关机、重启指令记录
  • vue3对比vue2的性能优化和提升 :Vue 3 vs Vue 2
  • 重学React(三):状态管理
  • windows内核研究(内存管理-线性地址的管理)
  • Java集合的遍历方式(全解析)
  • 0807 IO线程的同步互斥
  • latex in overleaf快速通关论文排版
  • FPGA学习笔记——VGA显示静态图片(ROM IP核)
  • 【数据结构入门】双向链表
  • 深入理解 S7-200 SMART 的 “数据语言”:从位到字符串的格式密码
  • C++线程库的学习
  • 【JS】扁平树数据转为树结构
  • 蓝桥杯----数码管、按键、定时器与中断
  • 【感知机】感知机(perceptron)学习算法的收敛性
  • 代码随想录算法训练营 Day20
  • Redis面试精讲 Day 13:Redis Cluster集群设计与原理
  • P1037 [NOIP 2002 普及组] 产生数
  • NFS 服务器
  • Docker容器强制删除及文件系统修复完整指南
  • mysql的InnoDB索引总结
  • 传统防火墙与下一代防火墙
  • 中介效应分析 原理解释 实例分析
  • python中的集合
  • 移动端录屏需求调研:以小熊录屏为例的轻量级实现方案