C# 类教程-继承:重写(virtual 与 override)

  • C# 类教程-类
  • C# 类教程-类成员:字段(域)、属性、索引
  • C# 类教程-类成员:方法、事件
  • C# 类教程-类成员:运算符重载与索引器
  • C# 类教程-类成员:构造函数和析构函数
  • C# 类教程-类成员:嵌套类型
  • C# 类教程-访问修饰符与可访问性级别
  • C# 类教程-继承
  • C# 类教程-继承:方法重载
  • C# 类教程-继承:隐藏(new)
  • C# 类教程-继承:重写(virtual 与 override)
  • C# 类教程-继承:抽象(abstract)
  • C# 类教程-多态性

重写又称覆盖、改写。

我们推荐您阅读同名文章:new、virtual、override、abstract 等-覆盖(改写、重写),其总结性更强。

  • virtual 用在基类中,指定一个虚方法(属性),表示这个方法(属性)可以重写。
  • override 用在派生类中,表示对基类虚方法(属性)的重写。

以上的基类和派生类都是相对的。B 是 C 的基类,也可以是 A 的派生类,B 中既可以对 A 中的 virtual 虚方法用 override 重写,也可以指定 virtual 虚方法供 C 重写。

  • 不能重写非虚方法或静态方法。重写的基方法必须是 virtual、abstract 或 override 的。为什么 override 也可以重写呢?因为基类中的 override 实际上是对基类的基类进行的重写,由于继承可传递,所以也可以对基类中 override 的方法进行重写。
  • override 声明不能更改 virtual 方法的可访问性。override 方法和 virtual 方法必须具有相同的访问级别修饰符。
  • 重写方法声明的返回值类型和基类的严格、完全一致。
  • 不能使用修饰符 new、static、virtual 或 abstract 来修改 override 方法。
  • 重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是 virtual、abstract 或 override 的。
public class BaseClass
{
    public virtual string GetString()
    {
        return "这是一个虚方法。";
    }
}


public class DerivedClass : BaseClass
{
    public override string GetString()
    {
        return "这是重写了的方法。";
    }
}

可以看出,重写与前面讲的重载是有区别的,其区别将在下一节中一并列出。

  • C# 类教程-类
  • C# 类教程-类成员:字段(域)、属性、索引
  • C# 类教程-类成员:方法、事件
  • C# 类教程-类成员:运算符重载与索引器
  • C# 类教程-类成员:构造函数和析构函数
  • C# 类教程-类成员:嵌套类型
  • C# 类教程-访问修饰符与可访问性级别
  • C# 类教程-继承
  • C# 类教程-继承:方法重载
  • C# 类教程-继承:隐藏(new)
  • C# 类教程-继承:重写(virtual 与 override)
  • C# 类教程-继承:抽象(abstract)
  • C# 类教程-多态性

你可能感兴趣的