覆盖和隐藏的访问修饰符

最先说总结

  • 不管是隐藏还是覆盖,基类方法都不能是 private 的:如果是 private 的,派生类都认不到他,谈何隐藏,谈何覆盖。此时对派生类和外界来说,就像没那个 private 方法一样。也就是说至少基类方法要对派生类方法可见,否则谈隐藏、覆盖是谈不起来的。
  • 隐藏可以改变访问修饰符,但这种改变通常没有意义。如果是改大,说明基类方法限得死,外界可能访问不了,会出错;如果是改小,说明派生类方法对外界来说是不存在的,外界访问的总是基类的方法。
  • 覆盖不可改变访问修饰符。

先说隐藏

如果派生类中无法访问基类的方法,则无法实现隐藏。比如基类的方法是 private,则派生类不能用 new 对其进行隐藏。

如果基类方法是公开的 public,则派生类可以改变访问修饰符,比如改变为 private,此时同样需要 new 标识。但是这样多态就实现不了了,不管派生类对象是派生类类型还是基类类型,都是访问的基类方法。

如果基类方法是 protected,情况怎么样呢?此时派生类可以隐藏之,也可以改变访问修饰符。但此时多态没有意义了,因为派生类对象是基类类型时,试图访问基类的方法,但由于基类是 protected 的,外面访问不了,会出错。

所以说,要用隐藏,还是都用 public 吧,免得搞些事出来。

再说覆盖

覆盖要求基类是 virtual 的,C# 不像 Java,Java 默认方法都是 virtual 的,C# 必须用 virtual 关键字,C# 中 virtual 的方法不能是 private 的。

覆盖的方法可以是 protected 的,也可以是 public 的。派生类中覆盖的方法访问修饰符必须和基类的一样。

你可能感兴趣的