Files

135 lines
3.2 KiB
C#
Raw Permalink Normal View History

2025-09-11 15:07:37 +08:00
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
}
}
}