《.NET程序员面试秘笈》----面试题12 访问关键字this和base有什么作用-阿里云开发者社区

开发者社区> 人工智能> 正文

《.NET程序员面试秘笈》----面试题12 访问关键字this和base有什么作用

简介: 【考点】this的理解,base的理解。

本节书摘来自异步社区《.NET程序员面试秘笈》一书中的第1章,面试题12,作者: 张云翯, 更多章节内容可以访问云栖社区“异步社区”公众号查看。

面试题12 访问关键字this和base有什么作用

.NET程序员面试秘笈
【考点】this的理解,base的理解。

【出现频率】

【解答】

this关键字用于引用类的当前实例。base关键字用于派生类访问基类成员。

为了说明this和base在类中的具体应用,在ch01目录下新建一个程序文件,并命名为This.cs,编写代码如程序1.13所示。

程序1.13 this和base示例:This.cs

  using System;

  class This
  {
    static void Main()
    {
      Console.WriteLine("请输入书名:");
      string inputA = Console.ReadLine();
      Console.WriteLine("请输入作者:");
      string inputB = Console.ReadLine();
      //将用户输入的2个字符串传递给构造函数,创建Book类的实例bk
      Book bk = new Book(inputA, inputB);     
      //调用bk实例的getbook方法,并输出
      Console.WriteLine(bk.getbook());
      //创建PCBook类的实例pcbk
      PCBook pcbk = new PCBook();
      //调用pcbk实例的words方法
      pcbk.words();
    }
  }

  class Book              //声明Book类
  {
    private string _name;
    private string _author;
    internal Book()          //编写默认构造函数
    {
      Console.WriteLine("\n书是人类进步的阶梯!");
    }
    internal Book(string n, string a)   //编写重载构造函数
    {
      this._name = n;
      this._author = a;
    }
    internal string getbook()      //定义getbook方法
    {
       //拼接字符串,访问当前实例的Name属性,并调用Tool类的静态add方法,当前实例作为参数
      string booktxt = "\n【BookName】" + this.Name + "【Author】"+ Tool.add(this);    
      return booktxt;
    }
    internal string Name
    {
      get
      {
        return _name;
      }
    }
    internal string Author
    {
      get
      {
        return _author;
      }
    }
    internal virtual void words()     //定义words虚方法
    {
      Console.WriteLine("\n知识就是力量!");
    }
  }
  static class Tool
  {
    internal static string add(Book b)  //定义静态方法add,接收参数为Book类型
    {
      return b.Author;    
    }
  }
  class PCBook : Book         //声明PCBook类,继承Book类
  {
    internal PCBook() : base()    //默认构造函数预先调用基类默认构造函数
    {
      Console.WriteLine("来买计算机书籍吧!");
    }
    internal override void words()
    {
      base.words();        //调用基类的words虚方法 
      Console.WriteLine("计算机知识也是力量!");
    }
  }

在命令行下编译This.cs后,执行This程序,其效果如图1.19所示。


dffbc23959f0905c96ab636ef4dfcbd2fd755f41

本例展示了this和base在类中的应用,其程序工作步骤如下所示。

(1)主程序中接收了用户输入的两个值(书名和作者),然后将这两个值传递给Book类的构造函数,创建实例bk。这个步骤中,bk对象的_name字段和_author字段被赋予了新值,可见,this的作用即引用当前的实例对象,其代码如下:

this._name = n;         //n为构造函数接收的第1个字符串参数
this._author = a;        //a为构造函数接收的第2个字符串参数

(2)调用bk对象的getbook方法,其方法体调用了Tool类的静态方法add静态方法,并通过this向其传递当前实例。getbook方法实际执行代码如下:

//Tool.add(this)返回当前实例的Author属性
string booktxt = "\n【BookName】" + this.Name + "【Author】"+ this.Author; 
//本方法最终返回booktxt变量
return booktxt;

(3)创建PCBook类的实例pcbk,由于其默认构造函数将通过base调用基类的默认构造函数,所以创建pcbk的实例将执行以下代码:

Console.WriteLine("\n书是人类进步的阶梯!");    //通过base()调用基类的默认构造函数
Console.WriteLine("来买计算机书籍吧!");      //PCBook类的默认构造函数的函数体

(4)pcbk调用words方法,PCBook类的words方法继承并重写了Book类的words方法。PCBook类的words方法体中通过base.words(),调用了基类的words方法(未被重写)。所以pcbk对象的words方法实际执行代码如下:

Console.WriteLine("\n知识就是力量!");       //通过base.words()调用基类的words方法
Console.WriteLine("计算机知识也是力量!");

【分析】

在面向对象的编程中,this访问关键字使用非常频繁,其中文意思为“这个”,非常形象地描述了this关键字的作用。类通过创建实例执行具体的任务,而类体代码中的this用于引用类的当前实例。相应地,静态成员和实例无关,所以静态成员中不能使用this。

注意:
this仅限于构造函数和方法成员中使用。
base访问关键字可用于访问基类成员,即基类被重写的方法和基类的构造函数。由于派生类继承了所有的基类成员,所以一般的基类成员可直接访问,但是基类被重写的虚方法只能通过base访问。同样,如果创建派生类的实例,其构造函数可通过base访问基类的构造函数,复用基类构造函数体的代码。这两种情况下,base的使用方法如以下代码所示:

base.方法名([参数列表]);            //用于派生类访问基类被重写的方法
派生类名称([参数列表]) : base(参数列表)     //派生类构造函数预先调用基类构造函数
{
}

注意:
base关键字访问基类的成员时,必须保证基类成员有相应的访问权限。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
人工智能
使用钉钉扫一扫加入圈子
+ 订阅

了解行业+人工智能最先进的技术和实践,参与行业+人工智能实践项目

其他文章