From c16355e935e641e91be5e5e6b5cbbb8dfc4d0040 Mon Sep 17 00:00:00 2001
From: Kister Hakusan <2753888203@qq.com>
Date: Sun, 14 Sep 2025 15:08:38 +0800
Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0Lesson18?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
C#核心/C#核心.sln | 12 ++
.../Lesson18_多态-抽象类和抽象方法.csproj | 11 ++
.../Lesson18_多态-抽象类和抽象方法/Program.cs | 77 ++++++++++++
.../Lesson18_多态-抽象类和抽象方法练习.csproj | 11 ++
.../Program.cs | 111 ++++++++++++++++++
5 files changed, 222 insertions(+)
create mode 100644 C#核心/Lesson18_多态-抽象类和抽象方法/Lesson18_多态-抽象类和抽象方法.csproj
create mode 100644 C#核心/Lesson18_多态-抽象类和抽象方法/Program.cs
create mode 100644 C#核心/Lesson18_多态-抽象类和抽象方法练习/Lesson18_多态-抽象类和抽象方法练习.csproj
create mode 100644 C#核心/Lesson18_多态-抽象类和抽象方法练习/Program.cs
diff --git a/C#核心/C#核心.sln b/C#核心/C#核心.sln
index f9e4ce1..37b3e4d 100644
--- a/C#核心/C#核心.sln
+++ b/C#核心/C#核心.sln
@@ -35,6 +35,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lesson17_多态-vob", "Less
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lesson17_多态-vob练习", "Lesson17_多态-vob练习\Lesson17_多态-vob练习.csproj", "{B9598C23-6AD4-44FB-B16B-6A0A80B8D9CD}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lesson18_多态-抽象类和抽象方法", "Lesson18_多态-抽象类和抽象方法\Lesson18_多态-抽象类和抽象方法.csproj", "{4EF4F902-1A00-4518-B21C-E7B6264CAB03}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lesson18_多态-抽象类和抽象方法练习", "Lesson18_多态-抽象类和抽象方法练习\Lesson18_多态-抽象类和抽象方法练习.csproj", "{7004726B-5B33-4B2A-ADDB-EF22DA593630}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -105,6 +109,14 @@ Global
{B9598C23-6AD4-44FB-B16B-6A0A80B8D9CD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B9598C23-6AD4-44FB-B16B-6A0A80B8D9CD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B9598C23-6AD4-44FB-B16B-6A0A80B8D9CD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4EF4F902-1A00-4518-B21C-E7B6264CAB03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4EF4F902-1A00-4518-B21C-E7B6264CAB03}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4EF4F902-1A00-4518-B21C-E7B6264CAB03}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4EF4F902-1A00-4518-B21C-E7B6264CAB03}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7004726B-5B33-4B2A-ADDB-EF22DA593630}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {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
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/C#核心/Lesson18_多态-抽象类和抽象方法/Lesson18_多态-抽象类和抽象方法.csproj b/C#核心/Lesson18_多态-抽象类和抽象方法/Lesson18_多态-抽象类和抽象方法.csproj
new file mode 100644
index 0000000..b9b92b9
--- /dev/null
+++ b/C#核心/Lesson18_多态-抽象类和抽象方法/Lesson18_多态-抽象类和抽象方法.csproj
@@ -0,0 +1,11 @@
+
+
+
+ Exe
+ net8.0
+ Lesson18_多态_抽象类和抽象方法
+ enable
+ enable
+
+
+
diff --git a/C#核心/Lesson18_多态-抽象类和抽象方法/Program.cs b/C#核心/Lesson18_多态-抽象类和抽象方法/Program.cs
new file mode 100644
index 0000000..492cc34
--- /dev/null
+++ b/C#核心/Lesson18_多态-抽象类和抽象方法/Program.cs
@@ -0,0 +1,77 @@
+namespace Lesson18_多态_抽象类和抽象方法
+{
+ #region 知识点一 抽象类
+ //概念
+ //被抽象关键字abstract修饰的类
+ //特点:
+ //1.不能被实例化的类
+ //2.可以包含抽象方法
+ //3.继承抽象类必须重写其抽象方法
+
+ abstract class Thing
+ {
+ //抽象类中封装的知识点都可以用
+ public string name;
+ //可以在抽象类中写抽象函数
+ }
+ class Water : Thing
+ {
+
+ }
+
+ #endregion
+
+ #region 知识点二 抽象函数
+ //又叫 纯 虚方法
+ //用abstract关键字修饰的方法
+ //特点:
+ //1.只能在抽象类中声明
+ //2.没有方法体
+ //3.不能是私有的
+ //4.继承后必须实现 用override重写
+ abstract class Fruit
+ {
+ public string name;
+ public abstract void Bad();//抽象方法 是一定不能有函数体的(大括号什么的)并且在子类中必须重写
+ public virtual void Test()//虚方法可以不重写
+ {
+
+ }
+ }
+ class Apple : Fruit
+ {
+ public override void Bad()
+ {
+ Console.WriteLine();
+ }
+ }
+ class SuperApple : Apple
+ {
+ public override void Bad()
+ {
+ base.Bad();
+ }
+ public override void Test()
+ {
+ base.Test();
+ }
+ }
+ #endregion
+ internal class Program
+ {
+ static void Main(string[] args)
+ {
+ //抽象类不能被实例化
+ //Thing t = new Thing();
+
+ //遵循里氏替换原则
+ Thing water = new Water();
+ }
+ }
+ //总结:
+ //如何选择普通类和抽象类?
+ //不希望被实例化的对象,比较笼统的对象
+ //例如:水果,人,事情
+ //或 父类中的行为不太需要被实现的,只希望子类区定义具体的规则的
+ //可以选择抽象类
+}
diff --git a/C#核心/Lesson18_多态-抽象类和抽象方法练习/Lesson18_多态-抽象类和抽象方法练习.csproj b/C#核心/Lesson18_多态-抽象类和抽象方法练习/Lesson18_多态-抽象类和抽象方法练习.csproj
new file mode 100644
index 0000000..4ce73f5
--- /dev/null
+++ b/C#核心/Lesson18_多态-抽象类和抽象方法练习/Lesson18_多态-抽象类和抽象方法练习.csproj
@@ -0,0 +1,11 @@
+
+
+
+ Exe
+ net8.0
+ Lesson18_多态_抽象类和抽象方法练习
+ enable
+ enable
+
+
+
diff --git a/C#核心/Lesson18_多态-抽象类和抽象方法练习/Program.cs b/C#核心/Lesson18_多态-抽象类和抽象方法练习/Program.cs
new file mode 100644
index 0000000..479ba74
--- /dev/null
+++ b/C#核心/Lesson18_多态-抽象类和抽象方法练习/Program.cs
@@ -0,0 +1,111 @@
+using System.Drawing;
+
+namespace Lesson18_多态_抽象类和抽象方法练习
+{
+ abstract class Animal
+ {
+ public abstract void Shout();
+ }
+ class Human : Animal
+ {
+ public override void Shout()
+ {
+ Console.WriteLine("人叫");
+ }
+ }
+ class Dog : Animal
+ {
+ public override void Shout()
+ {
+ Console.WriteLine("狗叫");
+ }
+ }
+ class Cat : Animal
+ {
+ public override void Shout()
+ {
+ Console.WriteLine("猫叫");
+ }
+ }
+ abstract class Graph
+ {
+ public abstract void Perimeter();
+ public abstract void Area();
+ }
+ class RectAngle : Graph
+ {
+ private int x, y;
+ public RectAngle(int x,int y)
+ {
+ this.x = x;
+ this.y = y;
+ }
+ public override void Area()
+ {
+ Console.WriteLine("面积为:"+x*y);
+ }
+
+ public override void Perimeter()
+ {
+ Console.WriteLine("周长为"+(x+y)*2);
+ }
+ }
+ class Square : Graph
+ {
+ private int x;
+ public Square(int x)
+ {
+ this.x = x;
+ }
+ public override void Area()
+ {
+ Console.WriteLine("面积为:" + x * x);
+ }
+
+ public override void Perimeter()
+ {
+ Console.WriteLine("周长为" + x * 4);
+ }
+ }
+ class Round : Graph
+ {
+ private double PI = 3.1415926;
+ int r;
+ public Round(int r)
+ {
+ this.r = r;
+ }
+ public override void Perimeter()
+ {
+ double perimeter = 2 * PI * r;
+ Console.WriteLine("圆的周长{0}", perimeter);
+ }
+ public override void Area()
+ {
+ double areas = PI * r * r;
+ Console.WriteLine("圆的面积{0}", areas);
+ }
+ }
+ internal class Program
+ {
+ static void Main(string[] args)
+ {
+ Animal human = new Human();
+ human.Shout();
+ Animal dog = new Dog();
+ dog.Shout();
+ Animal cat = new Cat();
+ cat.Shout();
+
+ Graph rectangle = new RectAngle(2, 3);
+ rectangle.Perimeter();
+ rectangle.Area();
+ Graph square = new Square(2);
+ square.Perimeter();
+ square.Area();
+ Graph round = new Round(3);
+ round.Perimeter();
+ round.Area();
+ }
+ }
+}