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 } } }