• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

wuchaocug

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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() 函数   依次类推即可

         运行结果如下: 

                       

}

posted on 2011-05-21 14:10  wuchaocug  阅读(465)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3