首页 > 编程笔记 > C#笔记

C# base关键字的用法

如果子类重写了父类的方法,并且想在子类的方法中调用父类原有的方法,该怎么办?为了满足这种需求,C# 提供了 base 关键字。

base 关键字的使用方法与 this 关键字类似。this 关键字代表本类对象,base 关键字代表父类对象,使用方法如下。
base.property; //调用父类的属性
base.method();//调用父类的方法
说明:如果要在子类中使用 base 关键字调用父类的属性或者方法,则父类的属性和方法的可访问性必须定义为 public 或者 protected,而不能是 private。

创建一个 Computer 类,用来作为父类;再创建一个 Pad 类,继承自 Computer 类。重写父类方法,并使用 base 关键字调用父类方法原有的逻辑,代码如下。
class Computer//父类:计算机
{
    public string sayHello()
    {
        return "欢迎使用";
    }
}
class Pad : Computer//子类:平板电脑
{
    public new string sayHello()//子类重写父类方法
    {
        return base.sayHello() + "平板电脑";//调用父类方法,在结果后添加字符串
    }
}
class Program
{
    static void Main(string[] args)
    {
          Computer pc = new Computer();//计算机类
          Console.WriteLine("父类sayHello方法结果:" + pc.sayHello());
          Pad ipad = new Pad();//平板电脑类
          Console.WriteLine("\n子类sayHello方法结果:" + ipad.sayHello());
          Console.ReadLine();
    }
}
上面代码中,在子类中定义 sayHello 方法时,用了 new 关键字。这是因为子类中的 sayHello 方法与父类中的 sayHello 方法同名,而且返回值、参数完全相同,这时在该类中调用 sayHello 方法会产生歧义,所以加了 new 关键字来隐藏父类的 sayHello 方法。

程序运行结果为:

父类sayHello方法结果:欢迎使用
子类sayHello方法结果:欢迎使用平板电脑


另外,使用 base 关键字还可以指定创建子类对象时应调用的父类构造函数。例如,修改上面实例,在父类 Computer 中定义一个构造函数,用来为定义的属性赋初始值,代码如下。
public Computer(string name, string num)
{
     Name = name;
     Num = num;
}

在子类 Pad 中定义构造函数时,可使用 base 关键字调用父类 Computer 的构造函数,代码如下。
public Pad(string model, string name, string num) : base(name, num)
{
     Model = model;
}
注意,访问父类成员只能在构造函数、实例方法或实例属性中进行,因此在静态方法中使用 base 关键字是错误的。

推荐阅读