有五个类:分别是Boss、Enemy、Program、Type1Enemy、Type2Enemy
Boss:
namespace _054_函数的递归调用 { class Boss:Enemy { //public override void Move()//重写,原来的方法不在了 //{ // Console.WriteLine("这是Boss的移动方法"); //} public new void Move()//当子类里面有一个签名于父类相同的方法的时候,就会把父类中的方法隐藏 {//隐藏只是把父类中的方法隐藏看不到,实际还存在 Console.WriteLine("这是Boss的移动方法"); } public void Attack() { AI(); Move(); HP = 100;//父类里面公有的数据和函数成员蔡可以在子类里面访问 Console.WriteLine("Boss正在进行攻击"); } } }Enemy:
namespace _054_函数的递归调用 { class Enemy { private float hp; private float speed; public float HP { get { return hp; } set { hp = value; } } public float Speed { get { return speed; } set { speed = value; } } public void AI() { //Move(); Console.WriteLine("这里是Enemy1的公有AI方法"); } //public virtual void Move() //{ // Console.WriteLine("这里是Enemy1的公有Move方法"); //} public void Move() { Console.WriteLine("这里是Enemy1的公有Move方法"); } } }Program:
namespace _054_函数的递归调用 { class Program { static void Main() { //Boss boss = new Boss(); //boss.AI();//继承:父类里面所有的数据成员和函数成员都会继承到子类里面 //boss.Attack(); //Enemy enemy; //enemy=new Boss();//父类声明的对象,可以由子类去构造 子类声明的对象不可以用父类去构造 //enemy虽然使用弗雷进行了声明,但是使用了子类构造,所以本质上是一个子类类型,我们可以强制类型转换 //Boss boss = (Boss)enemy; //boss.Attack(); // Enemy enemy = new Enemy(); //Boss boss = (Boss)enemy;//一个对象是什么类型的 主要看它是通过声明构造的 这里enemy使用了父类的构造函数,所以只有父类的字段可以强制转换 //Boss boss = new Boss(); //boss.Attack(); //boss.AI();//重写虚函数后,不管在哪里调用,都调用的是重写后的函数 //Enemy enemy = new Enemy(); //enemy.AI(); Enemy boss = new Boss(); boss.Move();//隐藏方法:如果使用子类声明的对象,调用隐藏方法会调用子类的如果使用父类声明,就会调用父类的 Console.Read(); } } }Type1Enemy
namespace _054_函数的递归调用 { class Type1Enemy:Enemy { } }Type2Enemy
namespace _054_函数的递归调用 { class Type2Enemy:Enemy { } }