继承
当多个类有很多相似的数据,比如在一个在游戏中,Boss类和小怪Enemy类,他们都有存在hp这个属性,但是也存在不同的地方,这个时候可以使用继承来维护的=这两个类。
继承的类型:
- 实现继承
- 接口继承
怪物基类BaseEnemy
class BaseEnemy
{
private float hp;
private float spped;
public float HP
{
set { hp = value; }
get { return hp; }
}
public float Speed
{
set { hp = value; }
get { return spped; }
}
public void AI()
{
Console.WriteLine("这是基类的AI方法");
}
public void Move()
{
Console.WriteLine("这是基类的移动方法");
}
}
子类Boss
class Boss:BaseEnemy //继承有怪物基类
{
public void Attack()
{
AI();
Move();
//hp = 100;
HP = 100;
//父类里面只有公有变量(public)和函数成员可以直接在子类访问
Console.WriteLine("这是Boss特有的攻击方法");
}
}
主函数:
class Program
{
static void Main(string[] args)
{
Boss boss = new Boss();
boss.Attack();
//父类里面所有的数据的数据成员和函数成员都会继承到子类里面
Console.ReadKey();
}
}
运行结果:
这是基类的AI方法
这是基类的移动方法
这是Boss特有的攻击方法
父类声明的对象可以用子类去构造,但是子类声明的对象不能用父类去构造
例子:
BaseEnemy baseEnemy = new Boss();
Boss boss = (Boss)baseEnemy;
boss.Attack();
虚方法 Virtual
虚函数不一定要重写
当多个怪物类拥有不同的动画系统时,基类就可以使用虚方法的形式供子类调用,子类负责重写虚方法,然后完善各自的细节
父类BaseEnemy:
public virtual void Animataion() //提供子类重写的虚方法
{
Console.WriteLine("这是基类的动画方法");
}
子类Boss:
public override void Animataion()
{
Console.WriteLine("这是Boss特有的动画");
}
调用结果:
Boss boss = new Boss();
boss.Animataion();
//调用结果:
//这是Boss特有的动画
抽象方法(abstract)
抽象方法必须要重写
抽象类不能实例化,抽象类可以包含一个普通函数和抽象函数,抽象函数只有函数定义没有函数体。
this 和 base 关键字
- this 可以访问当前类只能滚定义的字段,属性和方法,用this可以给出提示,不用this也是可以访问的
- base调用父类的方法
密封类和密封方法 sealed
对于类,这表示不能继承该类。对于方法,表示该方法不能重写
特点:
可以防止重写某些类导致代码混乱
派生类的构造函数
在子类中,会的先调用父类的构造函数,然后在条用子类的构造函数。
例:
Public class Boss{
public Boss():base(){
//Do something
}
}
修饰符
protect受保护的方法,只有派生类才可以调用
static 静态方法,只能通过类名访问
定义和实现的接口
每个类可以实现多个的接口,但是只能继承一个类
接口类:
interface Ifly()
{
void Fly();
}
实现类:
class Brid : IFly
{
public void Fly()
{
//TODO
}
}
泛型
定义一个泛型就是指,定义一个类,这个类中的某些字段的类型是不确定的,这些类型可以在构造函数的时候确定下来
定义一个带有构造函数的泛型类:
class Generic<T> //定义一个泛型T的数据类型,在构造函数的时候确定T的类型
class Generic<T> //定义一个泛型T的数据类型,在构造函数的时候确定T的类型
{
private T a;
private T b;
public Generic(T a,T b)
{
this.a = a;
this.b = b;
}
public void GetSum() //参数的相连
{
Console.WriteLine( a + "" + b);
}
}
主程序:
class Program
{
static void Main(string[] args)
{
var v= new Generic<string>("www.","baidu.com");
v.GetSum();
Console.ReadKey();
}
}
运行结果:
www.baidu.com
泛型方法
public static string GetSum<T1,T2>(T1 a,T2 b) //带有两个形参的泛型方法
{
return a + " " + b;
}
主程序:
static void Main(string[] args)
{
string s = GetSum<int, double>(1, 3.14159);
Console.WriteLine(s);
Console.ReadKey();
}
输出结果:
1 3.14159