1.面向对象编程-继承
1.继承是什么?
在上一节课中学习了如何定义类,用类当做模板来声明我们的数据。
很多类中有相似的数据,比如在一个游戏中,有Boss类,小怪类Enemy,这些类他们有很多相同的属性,也有不同的,这个时候我们可以使用继承来让这两个类继承自同一个类。
2.继承的类型
实现继承:
表示一个类型派生于一个基类型,它拥有该基类型的所有成员字段和函数。 在实现继承中,派生类型采用基类型的每个函数的实现代码,除非在派生类型的定义中指定重写某个函数的实现代码。 在需要给现有的类型添加功能,或许多相关的类型共享一组重要的公共功能时,这种类型的继承非常有用。
接口继承:
表示一个类型只继承了函数的签名,没有继承任何实现代码。 在需要指定该类型具有某些可用的特性时,最好使用这种类型的继承。
3.多重继承
一些语言(C++)支持所谓的 “多重继承”,即一个类派生自多个类。 使用多重继承的优点是有争议的:一方面,毫无疑问,可 以使用多重继承编写非常复杂、但很紧凑的代码,。另一方面,使用多重实现继承的代码常常很难理解和调试。 如前所述,简化健壮代码的编写工作是开发 C#的重要设计 目标。 因此,C#不支持多重实现继承。 而 C#允许类型派生自多个接 口—— 多重接口继承。 这说明,C#类可以派生自另一个类和任意多个接口。更准确地说, System.Object 是一个公共的基类,所以每个C#(除了Object类之外)都有一个基类,还可以有任意多个基接口。
4.实现继承
如果要声明派生自另一个类的一个类,就可以使用下面的语法:
class MyDerivedClass : MyBaseclass
{
// functions and data members here
}
如果类(或结构)也派生自接口,则用逗号分隔列表中的基类和接口:
public class MyDerivedClass: MyBaseClass , IInterface1 , IInterface2
{
// etc.
}
5.案例实现
基类敌人类( hp speed 方法 ai move )
派生出来两个类
boss类
type1enemy类
type2enemy类
namespace 面向对象编程_继承
{
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()
{
Console.WriteLine("这里是enemy1的共有Ai方法");
}
public void Move()
{
Console.WriteLine("这里是enemy1共有的move方法");
}
}
}
namespace 面向对象编程_继承
{
class Boss : Enemy
{
public void Attack()
{
AI();
Move();
//hP = 100;//这个调用不到
HP = 100;//父类里面共有的数据和函数成员才可以在子类里面访问
Console.WriteLine("Boss正在进行攻击");
}
}
}
namespace 面向对象编程_继承
{
class Type1Enemy:Enemy
{
}
}
namespace 面向对象编程_继承
{
class Type2Enemy:Enemy
{
}
}
namespace 面向对象编程_继承
{
class Program
{
static void Main(string[] args)
{
//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是用来父类的构造函数,所以只有父类中的字段和方法,不能强制转换成子类
Console.ReadKey();
}
}
}