base与this 的理解
实例化的顺序是一个有底层到高层检索,然后由高层向底层实例化的过程,所以是一来一去。
对于 base与this 的理解如下:
base用于继承层次中的访问,this是对象自身中的访问;
base局限在构造函数、实例方法和实例属性访问器中;
功能包括:
调用基类上已被其他方法重写的方法。
指定创建派生类实例时应调用的基类构造函数。
base 调用顺序如下:
调用直接父类的方法成员,如果直接父类没有就再往上级找,直到找到为止
this作用于构造函数时,表示对本类构造函数的调用,这种方式常用于创建多个构造函数的情况,通过this()或者this(参数列表)可以方便的调用已经存在的构造函数。
namespace this与base
{
class Vehicle
{
private string name;
private int speed;
private string[] array = new string[10];
public Vehicle()
{
}
//限定被相似的名称隐藏的成员
public Vehicle(string name, int speed)
{
this.name = name;
this.speed = speed;
}
public virtual void ShowResult()
{
Console.WriteLine("The top speed of {0} is {1}.", name, speed);
}
public void Run()
{
//传递当前实例参数
Action.ToRun(this);
}
//声明索引器,必须为this,这样就可以像数组一样来索引对象
public string this[int param]
{
get { return array[param]; }
set { array[param] = value; }
}
}
class Car : Vehicle
{
//派生类和基类通信,以base实现,基类首先被调用
//指定创建派生类实例时应调用的基类构造函数
public Car()
: base("Car", 200)
{ }
public Car(string name, int speed)
: this()
{ }
public override void ShowResult()
{
//调用基类上已被其他方法重写的方法
base.ShowResult();
Console.WriteLine("It's a car's result.");
}
}
class Audi:Car
{
public Audi()
: base("Audi", 300)
{ }
public Audi(string name, int speed)
: this()
{
}
public override void ShowResult()
{
//在直接基类中有方法实现时,则base只能继承其直接基类成员,而如果直接基类没有该实现时,则base方法会向上访问,例如base.Run()其实方法的是Vehicle::Run()
base.ShowResult();
base.Run();
Console.WriteLine("It's audi's result.");
}
}
上述 三个类的继承关系如下 : Audi:Car Car : Vehicle Vehicle
Vehicle 有两个构造函数 Vehicle() Vehicle(string name, int speed) ,两个函数 ShowResult() Run() 一个索引器 this[int param]
Car 有两个构造函数 Car() : base("Car", 200) Car(string name, int speed) : this() 一个函数 ShowResult()
Audi 有两个构造函数 Audi(): base("Audi", 300) Audi(string name, int speed) : this() 一个函数 ShowResult()
Main函数中 声明 Audi audi = new Audi(); 时,先调用 audi.Audi(): base("Audi", 300);
由于 Car 有 Car(string name, int speed): this() 和 Vehicle 有 Vehicle(string name, int speed) 所以,
audi.Audi(): base("Audi", 300) 调用 Car(string name, int speed): this() ;这样说明
base 调用顺序如下:调用直接父类的方法成员,如果直接父类没有就再往上级找,直到找到为止
audi.Run();
调用的是 基类的 Run() 函数 依次类推即可
运行结果如下:
}