调用基类构造器
在构建派生类前,会首先构建出完整的基类。
即便是派生类无权访问的成员,也会存在。
因此才能保证派生类能完全地当作基类来使用。
因此,在执行派生类的构造器前,首先需要先调用基类的构造器。
而如果基类没有,或是无权访问他的无参构造器,
那么你就需要显式地声明派生类构造器,并指明如何调用基类构造器。
class 英雄
{
protected int hp;
protected int atk;
public static int maxLevel = 18;
public 英雄(int hp, int atk)
{
this.hp = hp;
this.atk = atk;
}
}
显式调用基类构造器地语法是,把调用自己构造器的语法中的this改成base。
关键字base即指代直接基类。
class 盖伦 : 英雄
{
public 盖伦(int hp, int atk) : base(hp, atk)
{
}
}
访问基类的其他成员
访问基类成员需要有他的访问权限。
对于非嵌套类,需要只能访问基类protected及以上的成员。无论实例成员还是静态成员。
静态成员
静态成员不会继承下来。虽然派生类可以不带类型名直接访问基类的静态成员,
但派生类自己不会另外保存一份数据。
所有通过派生类访问的基类静态成员,都是确实地访问到基类的静态成员。
Console.WriteLine(英雄.maxLevel);//18
盖伦.maxLevel = 20;
Console.WriteLine(英雄.maxLevel);//20
兄弟类型的基类成员
派生类只能从自己或从自己派生类型,的实例上访问继承自基类的成员。
class 艾希 : 英雄
{
public 艾希(int hp, int atk) : base(hp, atk)
{
}
}
艾希类和盖伦类都继承自英雄类。但他们不在同一条继承链上。
类型继承一旦分家,就会翻脸不认人。
虽然盖伦能访问自己身上继承来的基类成员,但不能访问兄弟类上继承来的基类成员。
并且由于多态的特性,兄弟类是可以给基类型的变量赋值的。
由于基类变量的值可能是兄弟类型,所以你不能从基类类型中访问基类成员。
class 盖伦 : 英雄
{
public 盖伦(int hp, int atk) : base(hp, atk)
{
}
public void 致死打击()
{
英雄 a = this;
a.hp -= 20;//即便是把自己转为基类型,也无权访问
}
}