From d6767da6da05a966f124d668a36a0dfb4f243056 Mon Sep 17 00:00:00 2001
From: Kister Hakusan <2753888203@qq.com>
Date: Thu, 11 Sep 2025 15:07:37 +0800
Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0Lesson17?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
C#核心/C#核心.sln | 12 ++
.../Lesson14_继承-继承中的构造函数/Program.cs | 5 +-
.../Lesson17_多态-vob/Lesson17_多态-vob.csproj | 11 ++
C#核心/Lesson17_多态-vob/Program.cs | 134 +++++++++++++++
.../Lesson17_多态-vob练习.csproj | 11 ++
C#核心/Lesson17_多态-vob练习/Program.cs | 154 ++++++++++++++++++
6 files changed, 325 insertions(+), 2 deletions(-)
create mode 100644 C#核心/Lesson17_多态-vob/Lesson17_多态-vob.csproj
create mode 100644 C#核心/Lesson17_多态-vob/Program.cs
create mode 100644 C#核心/Lesson17_多态-vob练习/Lesson17_多态-vob练习.csproj
create mode 100644 C#核心/Lesson17_多态-vob练习/Program.cs
diff --git a/C#核心/C#核心.sln b/C#核心/C#核心.sln
index ec67d2d..f9e4ce1 100644
--- a/C#核心/C#核心.sln
+++ b/C#核心/C#核心.sln
@@ -31,6 +31,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lesson16_继承-密封类",
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lesson16_继承-密封类练习", "Lesson16_继承-密封类练习\Lesson16_继承-密封类练习.csproj", "{673FABF2-99A7-4E63-B1F6-37AB53B6EC85}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lesson17_多态-vob", "Lesson17_多态-vob\Lesson17_多态-vob.csproj", "{9B334A2E-3B5C-49AC-B1E8-2CE2FDC04158}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lesson17_多态-vob练习", "Lesson17_多态-vob练习\Lesson17_多态-vob练习.csproj", "{B9598C23-6AD4-44FB-B16B-6A0A80B8D9CD}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -93,6 +97,14 @@ Global
{673FABF2-99A7-4E63-B1F6-37AB53B6EC85}.Debug|Any CPU.Build.0 = Debug|Any CPU
{673FABF2-99A7-4E63-B1F6-37AB53B6EC85}.Release|Any CPU.ActiveCfg = Release|Any CPU
{673FABF2-99A7-4E63-B1F6-37AB53B6EC85}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9B334A2E-3B5C-49AC-B1E8-2CE2FDC04158}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9B334A2E-3B5C-49AC-B1E8-2CE2FDC04158}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9B334A2E-3B5C-49AC-B1E8-2CE2FDC04158}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9B334A2E-3B5C-49AC-B1E8-2CE2FDC04158}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B9598C23-6AD4-44FB-B16B-6A0A80B8D9CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {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
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/C#核心/Lesson14_继承-继承中的构造函数/Program.cs b/C#核心/Lesson14_继承-继承中的构造函数/Program.cs
index 3a4a882..9e70ff7 100644
--- a/C#核心/Lesson14_继承-继承中的构造函数/Program.cs
+++ b/C#核心/Lesson14_继承-继承中的构造函数/Program.cs
@@ -55,7 +55,8 @@
//父类的父类的构造->...父类构造->...->子类构造
class GameObject
{
- public GameObject() {
+ public GameObject()
+ {
Console.WriteLine("gameobject的构造函数");
}
}
@@ -104,7 +105,7 @@
class Son : Father
{
- public Son(int i):base(i)//用base来传给父类构造函数一个值
+ public Son(int i) : base(i)//用base来传给父类构造函数一个值
{
Console.WriteLine("son 1,参数i的值{0}", i);
}
diff --git a/C#核心/Lesson17_多态-vob/Lesson17_多态-vob.csproj b/C#核心/Lesson17_多态-vob/Lesson17_多态-vob.csproj
new file mode 100644
index 0000000..86ddb13
--- /dev/null
+++ b/C#核心/Lesson17_多态-vob/Lesson17_多态-vob.csproj
@@ -0,0 +1,11 @@
+
+
+
+ Exe
+ net8.0
+ Lesson17_多态_vob
+ enable
+ enable
+
+
+
diff --git a/C#核心/Lesson17_多态-vob/Program.cs b/C#核心/Lesson17_多态-vob/Program.cs
new file mode 100644
index 0000000..9c9354f
--- /dev/null
+++ b/C#核心/Lesson17_多态-vob/Program.cs
@@ -0,0 +1,134 @@
+namespace Lesson17_多态_vob
+{
+ #region 知识回顾
+
+ #region 封装——用程序语言来形容对象
+ class 类名
+ {
+ #region 特征——成员变量
+ #endregion
+
+ #region 行为——成员方法
+ #endregion
+
+ #region 初始化调用——构造函数
+ #endregion
+
+ #region 释放时调用——析构函数
+ #endregion
+
+ #region 保护成员变量——成员属性
+ #endregion
+
+ #region 像数组一样使用——索引器
+ #endregion
+
+ #region 类名点出直接使用——静态成员
+ #endregion
+
+ #region 自定义对象可计算——运算符重载
+ #endregion
+ }
+
+ #region 静态类和静态构造函数
+ #endregion
+
+ #region 拓展方法
+ #endregion
+
+ #endregion
+
+ #region 继承——复用封装对象的代码:儿子继承父亲,复用现成代码
+ #endregion
+
+ #endregion
+
+ #region 知识点一 多态的概念
+ // 多态按字面意思就是“多种状态”
+ // 让继承同一父类的子类们 在执行相同方法时有不同的表现(状态)
+ // 主要目的
+ // 同一父类的对象 执行相同行为(方法)有不同的表现
+ // 解决的问题
+ // 让同一个对象有位移行为的特征
+ #endregion
+
+ #region 知识点二 解决的问题
+ class Father
+ {
+ public void Speak()
+ {
+ Console.WriteLine("Father Speak");
+ }
+ }
+ class Son : Father
+ {
+ public void Speak()
+ {
+ Console.WriteLine("Son Speak");
+ }
+ }
+ #endregion
+
+ #region 知识点三 多态的实现
+ //我们目前已经学过的多态
+ //编译时多态——函数重载,开始就写好的
+
+ //我们将学习的:
+ //运行时多态(vob、抽象函数、接口)
+ //我们今天学习 vob
+ //v: virtual(虚函数)
+ //o: override(重写)
+ //b: base(父类)
+
+
+
+ class GameObject
+ {
+ public string name;
+ public GameObject(string name)
+ {
+ this.name = name;
+ }
+
+ public virtual void Atk()//虚函数
+ {
+ Console.WriteLine("游戏对象攻击");
+ }
+ }
+ class Player : GameObject
+ {
+ public Player(string name):base(name)
+ {
+
+ }
+ //代表着重写虚函数
+ public override void Atk()
+ {
+ //base来保留父类的函数
+ base.Atk();//执行父类(base)的Atk方法
+ Console.WriteLine("玩家对象攻击");
+ }
+ }
+ #endregion
+ internal class Program
+ {
+ static void Main(string[] args)
+ {
+ Console.WriteLine("Hello, World!");
+ #region 解决的问题
+ Father f = new Son();
+ f.Speak();
+
+ (f as Son).Speak();
+ #endregion
+
+ #region 多态的使用
+ GameObject p = new Player("123");
+ p.Atk();//虽然是父类对象装载的p,但是p是他的子类player类型的
+ //如果不用override来重写,那么调用的atk将会是父类的atk
+ //既然有了虚函数和重写那么调用的就是子类的atk
+
+ #endregion
+ }
+ }
+}
diff --git a/C#核心/Lesson17_多态-vob练习/Lesson17_多态-vob练习.csproj b/C#核心/Lesson17_多态-vob练习/Lesson17_多态-vob练习.csproj
new file mode 100644
index 0000000..3556c3b
--- /dev/null
+++ b/C#核心/Lesson17_多态-vob练习/Lesson17_多态-vob练习.csproj
@@ -0,0 +1,11 @@
+
+
+
+ Exe
+ net8.0
+ Lesson17_多态_vob练习
+ enable
+ enable
+
+
+
diff --git a/C#核心/Lesson17_多态-vob练习/Program.cs b/C#核心/Lesson17_多态-vob练习/Program.cs
new file mode 100644
index 0000000..323793a
--- /dev/null
+++ b/C#核心/Lesson17_多态-vob练习/Program.cs
@@ -0,0 +1,154 @@
+using System.Threading.Channels;
+
+namespace Lesson17_多态_vob练习
+{
+ #region 鸭子题
+ class Duck
+ {
+ public virtual void Speak()
+ {
+ Console.WriteLine("嘎嘎叫");
+ }
+ }
+ class WoodDuck : Duck
+ {
+ public override void Speak()
+ {
+ Console.WriteLine("吱吱叫");
+ }
+
+ }
+ class RubberDuck : Duck
+ {
+ public override void Speak()
+ {
+ Console.WriteLine("叽叽叫");
+ }
+ }
+ #endregion
+
+ #region 打卡题
+ class Staff
+ {
+ public virtual void Clockin()
+ {
+ Console.WriteLine("员工9点打卡");
+ }
+ }
+ class Boss: Staff
+ {
+ public override void Clockin()
+ {
+ Console.WriteLine("老板11点打卡");
+ }
+
+ }
+ class Programer : Staff
+ {
+ public override void Clockin()
+ {
+ Console.WriteLine("程序员无需打卡");
+ }
+ }
+ #endregion
+
+ #region 计算题
+ class Graph
+ {
+ public virtual void Perimeter()
+ {
+ Console.WriteLine("未初始化图形无法计算");
+ }
+ public virtual void Area()
+ {
+ Console.WriteLine("未初始化图形无法计算");
+ }
+ }
+ class Rectangle : Graph
+ {
+ public int x, y;
+ public Rectangle(int x, int y)
+ {
+ this.x = x;
+ this.y = y;
+ }
+ public override void Perimeter()
+ {
+ Console.WriteLine("矩形周长为{0}", (x + y) * 2);
+ }
+ public override void Area()
+ {
+ Console.WriteLine("矩形面积为{0}", x * y);
+ }
+ }
+ class Square : Graph
+ {
+ public int x;
+ public Square(int x)
+ {
+ this.x = x;
+ }
+
+ public override void Perimeter()
+ {
+ Console.WriteLine("方的周长为{0}", x * 4);
+ }
+ public override void Area()
+ {
+ Console.WriteLine("方的面积为{0}", x * x);
+ }
+ }
+ class Round : Graph
+ {
+ public 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);
+ }
+ }
+
+ #endregion
+
+ internal class Program
+ {
+ static void Main(string[] args)
+ {
+ Console.WriteLine("Hello, World!");
+ Duck realDuck = new Duck();
+ realDuck.Speak();
+ Duck woodDuck = new WoodDuck();
+ woodDuck.Speak();
+ Duck rubberDuck = new RubberDuck();
+ rubberDuck.Speak();
+
+ Programer p = new Programer();
+ p.Clockin();
+ Boss b = new Boss();
+ b.Clockin();
+ Staff s = new Staff();
+ s.Clockin();
+
+ 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();
+
+ }
+ }
+}
\ No newline at end of file