namespace Lesson13_继承_李氏替换原则 { #region 知识点一 基本概念 //里氏替换原则是面向对象七大原则中最重要的原则 //概念: //任何父类出现的地方,子类都可以替代 //重点: //语法表现——父类容器装子类对象,因为子类对象包含了父类的所有内容 //作用: //方便进行对象存储和管理 #endregion #region 知识点二 基本实现 class GameObject { } class Player:GameObject { public void PlayerAtk() { Console.WriteLine("玩家攻击"); } } class Monster :GameObject { public void MonsterAtk() { Console.WriteLine("怪物攻击"); } } class Boss:GameObject { public void BossAtk() { Console.WriteLine("Boss攻击"); } } #endregion internal class Program { static void Main(string[] args) { Console.WriteLine("Hello, World!"); //里氏替换原则 GameObject player = new Player(); GameObject monster = new Monster(); GameObject boss = new Boss(); GameObject[] objects = new GameObject[] { player, monster, boss }; //player.atk();//容器是gameobject,没有atk这个方法 #region 知识点三 is和as //基本概念 //is:判断一个对象是否执行类对象 //返回时:bool 是为真 不是为假 if (player is Player) { }else if (player is Monster) { } //as:将一个对象转换为指定类对象 //返回值:指定类型对象 //成功返回指定类型对象,失败返回null Player test = player as Player;//将player转换为Player类型对象(可)返回player类型对象(Player 类型的 test,存放player) Player test2 = monster as Player;//将monster转换为Player类型对象(报错)返回空(Player 类型的 test2, 存放的是空) //基本语法 // 类对象 is 类名 该语句块 会有一个bool返回值 true和false // 类对象 as 类名 该语句块 会有一个对象返回值 对象和null // 一般组合使用 if(player is Player) { //常规写法 //Player p1 = player as Player; //p1.PlayerAtk(); //一句话写法 (player as Player).PlayerAtk(); } //同时声明多个子类对象,并集中按需使用 ->GameObject[] objects = new GameObject[] { player, monster, boss }; for (int i = 0; i < objects.Length; i++) { if (objects[i] is Player) { //调用Player需要的逻辑 //eg: (objects[i] as Player).PlayerAtk(); } else if (objects[i] is Monster) { //调用Monster需要的逻辑 //eg: (objects[i] as Monster).MonsterAtk(); } else if (objects[i] is Boss) { //调用Boss需要的逻辑 //eg: (objects[i] as Boss).BossAtk(); } } #endregion } } }