本节书摘来自异步社区《.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所示。
本例展示了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关键字访问基类的成员时,必须保证基类成员有相应的访问权限。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。