From 372d55923a16e0e55cbf887d5cceee73743ca8a8 Mon Sep 17 00:00:00 2001 From: Kister Hakusan <2753888203@qq.com> Date: Sun, 14 Sep 2025 16:31:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0Lesson19?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- C#核心/C#核心.sln | 12 ++ .../Lesson19_多态-接口.csproj | 11 + C#核心/Lesson19_多态-接口/Program.cs | 189 ++++++++++++++++++ .../Lesson19_多态-接口练习.csproj | 11 + C#核心/Lesson19_多态-接口练习/Program.cs | 185 +++++++++++++++++ 5 files changed, 408 insertions(+) create mode 100644 C#核心/Lesson19_多态-接口/Lesson19_多态-接口.csproj create mode 100644 C#核心/Lesson19_多态-接口/Program.cs create mode 100644 C#核心/Lesson19_多态-接口练习/Lesson19_多态-接口练习.csproj create mode 100644 C#核心/Lesson19_多态-接口练习/Program.cs diff --git a/C#核心/C#核心.sln b/C#核心/C#核心.sln index 37b3e4d..316178c 100644 --- a/C#核心/C#核心.sln +++ b/C#核心/C#核心.sln @@ -39,6 +39,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lesson18_多态-抽象类 EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lesson18_多态-抽象类和抽象方法练习", "Lesson18_多态-抽象类和抽象方法练习\Lesson18_多态-抽象类和抽象方法练习.csproj", "{7004726B-5B33-4B2A-ADDB-EF22DA593630}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lesson19_多态-接口", "Lesson19_多态-接口\Lesson19_多态-接口.csproj", "{FC39DDE9-AC80-40A2-9CCA-DC06510A8881}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lesson19_多态-接口练习", "Lesson19_多态-接口练习\Lesson19_多态-接口练习.csproj", "{D511EDF3-7769-45BB-8304-3081918FA633}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -117,6 +121,14 @@ Global {7004726B-5B33-4B2A-ADDB-EF22DA593630}.Debug|Any CPU.Build.0 = Debug|Any CPU {7004726B-5B33-4B2A-ADDB-EF22DA593630}.Release|Any CPU.ActiveCfg = Release|Any CPU {7004726B-5B33-4B2A-ADDB-EF22DA593630}.Release|Any CPU.Build.0 = Release|Any CPU + {FC39DDE9-AC80-40A2-9CCA-DC06510A8881}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FC39DDE9-AC80-40A2-9CCA-DC06510A8881}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FC39DDE9-AC80-40A2-9CCA-DC06510A8881}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FC39DDE9-AC80-40A2-9CCA-DC06510A8881}.Release|Any CPU.Build.0 = Release|Any CPU + {D511EDF3-7769-45BB-8304-3081918FA633}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D511EDF3-7769-45BB-8304-3081918FA633}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D511EDF3-7769-45BB-8304-3081918FA633}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D511EDF3-7769-45BB-8304-3081918FA633}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/C#核心/Lesson19_多态-接口/Lesson19_多态-接口.csproj b/C#核心/Lesson19_多态-接口/Lesson19_多态-接口.csproj new file mode 100644 index 0000000..6b73120 --- /dev/null +++ b/C#核心/Lesson19_多态-接口/Lesson19_多态-接口.csproj @@ -0,0 +1,11 @@ + + + + Exe + net8.0 + Lesson19_多态_接口 + enable + enable + + + diff --git a/C#核心/Lesson19_多态-接口/Program.cs b/C#核心/Lesson19_多态-接口/Program.cs new file mode 100644 index 0000000..7432da7 --- /dev/null +++ b/C#核心/Lesson19_多态-接口/Program.cs @@ -0,0 +1,189 @@ +namespace Lesson19_多态_接口 +{ + #region 知识点一 接口的概念 + //接口是行为的抽象规范 + //他也是一种自定义类型 + //关键字 interface + + //接口声明的规范 + //1.不包含成员变量 + //2.只包含方法、属性、索引器、事件 + //3.成员不能被实现 + //4.成员可以不用写访问修饰符,不能是私有的 + //5.接口不能继承类,但是可以继承另一个接口 + + //接口的使用规范 + //1.类可以继承多个接口 + //2.类继承接口后,必须实现接口中所有成员 + + //特点: + //1.他和类的声明类似 + //2.接口是用来继承的 + //3.接口不能被实例化,但是可以作为容器存储对象 + #endregion + + #region 知识点二 接口的声明 + //接口的关键字:interface + //语法: + //interface 接口名 + //{ + //} + //一句话记忆:接口是抽象行为的基类 + //接口命名规范 帕斯卡前面加个I + interface IFly + { + //int a;不能包含成员变量 + void Fly();//可以加public和protect,不能加private这样违反了上面使用规范知识点的2 + string Name + { + get; + set; + } + int this[int index] + { + get; + set; + } + + event Action doSomthing;//先不学事件声明 + } + #endregion + + #region 知识点三 接口的使用 + class Animal + { + + } + //接口用来继承 + //1.类可以继承1个类,n个接口 + //2.继承了接口后 必须实现其中的内容 并且必须是public的 + class Human : Animal, IFly + { + public int this[int index] + { + get + { + return 0; + } + set + { + this[index] = value; + } + } + public string Name + { + get; + set; + } + public event Action doSomthing; + //3.实现的接口函数,可以通过加virtual再在子类中重写 + //4.接口也遵循里氏替换原则 + public virtual void Fly() + { + Console.WriteLine("人飞"); + } + } + #endregion + + #region 知识点四 接口可以继承接口 + //接口继承接口时 不需要实现 + //待类继承接口后 类自己去实现所有内容 + interface IWalk + { + void Walk(); + } + interface IMove : IFly,IWalk + { + void Move(); + } + class Test : IMove + { + public int this[int index] { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + + public string Name { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + + public event Action doSomthing; + + public void Fly() + { + throw new NotImplementedException(); + } + + public void Move() + { + throw new NotImplementedException(); + } + + public void Walk() + { + throw new NotImplementedException(); + } + } + #endregion + + #region 知识点五 显示实现接口 + //当一个类继承两个接口 + //但是接口中存在着同名方法时 + //注意:显示实现接口时 不能写访问修饰符 + + interface IAtk + { + void Atk(); + } + interface ISuperAtk + { + void Atk(); + } + class Player : ISuperAtk, IAtk + { + void ISuperAtk.Atk()//显示实现接口就是 接口名.方法 + { + throw new NotImplementedException(); + } + + void IAtk.Atk() + { + throw new NotImplementedException(); + } + public void Atk() + { + throw new NotImplementedException(); + } + } + #endregion + internal class Program + { + static void Main(string[] args) + { + //IFly f = new IFly();不能被实例化 + IFly f = new Human();//可以用里氏替换原则 + f.Fly(); + + IMove m = new Test(); + IFly f2 = new Test(); + IWalk w = new Test(); + + + IAtk ia = new Player(); + ISuperAtk isa = new Player(); + + Player p = new Player(); + (p as IAtk).Atk(); + (p as ISuperAtk).Atk(); + p.Atk(); + } + } + + // 总结: + // 继承类:是对象间的继承,包括特征行为等等 + // 继承接口:是行为间的继承,继承接口的行为规范,按照规范去实现内容 + // 由于接口也是遵循里氏替换原则,所以可以用接口容器装对象 + // 那么久可以实现 装载各种毫无关系但是却有相同行为的对象 + + // 注意: + //1. 接口值包含 成员方法、属性、索引器、事件,并且都不实现,都没有访问修饰符 + //2. 可以继承多个接口,但是只能继承一个类 + //3. 接口可以继承接口,相当于在进行行为合并,待子类继承时再去实现具体的行为 + //4. 接口可以被显示实现 主要用于实现不同接口中的同名函数的不同表现 + //5. 实现的接口方法 可以加 virtual 关键字 之后子类 再重写 +} diff --git a/C#核心/Lesson19_多态-接口练习/Lesson19_多态-接口练习.csproj b/C#核心/Lesson19_多态-接口练习/Lesson19_多态-接口练习.csproj new file mode 100644 index 0000000..a27c65d --- /dev/null +++ b/C#核心/Lesson19_多态-接口练习/Lesson19_多态-接口练习.csproj @@ -0,0 +1,11 @@ + + + + Exe + net8.0 + Lesson19_多态_接口练习 + enable + enable + + + diff --git a/C#核心/Lesson19_多态-接口练习/Program.cs b/C#核心/Lesson19_多态-接口练习/Program.cs new file mode 100644 index 0000000..5856684 --- /dev/null +++ b/C#核心/Lesson19_多态-接口练习/Program.cs @@ -0,0 +1,185 @@ +using Lesson19_多态_接口练习; + +namespace Lesson19_多态_接口练习 +{ + interface ICheck + { + public void Check(); + } + class Person : ICheck + { + public void Check() + { + Console.WriteLine("派出所登记"); + } + } + class Car + { + public void Check() + { + Console.WriteLine("车管所登记"); + } + } + class House + { + public void Check() + { + Console.WriteLine("房管局登记"); + } + } + + + interface IFly + { + public void Fly(); + } + interface IWalk + { + public void Walk(); + } + interface ISwim + { + public void Swim(); + } + + class Sparrow : IFly, IWalk + { + public void Fly() + { + Console.WriteLine("麻雀飞"); + } + public void Walk() + { + Console.WriteLine("麻雀走"); + } + } + class Ostrich : IWalk + { + public void Walk() + { + Console.WriteLine("鸵鸟走"); + } + } + class Penguin : IWalk, ISwim + { + public void Walk() + { + Console.WriteLine("企鹅走"); + } + public void Swim() + { + Console.WriteLine("企鹅游泳"); + } + } + class Parrot : IFly, IWalk +{ + public void Fly() + { + Console.WriteLine("鹦鹉飞"); + } + public void Walk() + { + Console.WriteLine("走"); + } + } + class Helicopter : IFly + { + public void Fly() + { + Console.WriteLine("直升机飞"); + } + } + class Swan : IFly, IWalk, ISwim + { + public void Fly() + { + Console.WriteLine("天鹅飞"); + } + public void Walk() + { + Console.WriteLine("天鹅走"); + } + public void Swim() + { + Console.WriteLine("天鹅游泳"); + } + } + + + interface IUSB + { + void ReadData(); + } + + class StorageDevice : IUSB + { + public string name; + public StorageDevice(string name) + { + this.name = name; + } + public void ReadData() + { + Console.WriteLine("USB{0}传输数据",name); + } + } + + class MP3 : IUSB + { + public void ReadData() + { + Console.WriteLine("MP3传输数据"); + } + } + class Computer + { + public IUSB usb1; + } + internal class Program + { + static void Main(string[] args) + { + Console.WriteLine("Hello, World!"); + Person p1= new Person(); + p1.Check(); + Car c1 = new Car(); + c1.Check(); + House h1 = new House(); + h1.Check(); + + Sparrow s1 = new Sparrow(); + s1.Walk(); + s1.Fly(); + Ostrich o1 = new Ostrich(); + o1.Walk(); + Penguin p2 = new Penguin(); + p2.Swim(); + p2.Walk(); + Parrot p3 = new Parrot(); + p3.Walk(); + p3.Fly(); + Helicopter h2 = new Helicopter(); + h2.Fly(); + Swan s3 = new Swan(); + s3.Walk(); + s3.Fly(); + s3.Swim(); + + StorageDevice hd = new StorageDevice("移动硬盘"); + StorageDevice ud = new StorageDevice("U盘"); + MP3 mp3 = new MP3(); + Computer computer = new Computer(); + + computer.usb1 = hd; + computer.usb1.ReadData(); + + computer.usb1 = ud; + computer.usb1.ReadData(); + + computer.usb1 = mp3; + computer.usb1.ReadData(); + + + } + } +}