最先说总结
先说隐藏
如果派生类中无法访问基类的方法,则无法实现隐藏。比如基类的方法是 private,则派生类不能用 new 对其进行隐藏。
如果基类方法是公开的 public,则派生类可以改变访问修饰符,比如改变为 private,此时同样需要 new 标识。但是这样多态就实现不了了,不管派生类对象是派生类类型还是基类类型,都是访问的基类方法。
如果基类方法是 protected,情况怎么样呢?此时派生类可以隐藏之,也可以改变访问修饰符。但此时多态没有意义了,因为派生类对象是基类类型时,试图访问基类的方法,但由于基类是 protected 的,外面访问不了,会出错。
所以说,要用隐藏,还是都用 public 吧,免得搞些事出来。
再说覆盖
覆盖要求基类是 virtual 的,C# 不像 Java,Java 默认方法都是 virtual 的,C# 必须用 virtual 关键字,C# 中 virtual 的方法不能是 private 的。
覆盖的方法可以是 protected 的,也可以是 public 的。派生类中覆盖的方法访问修饰符必须和基类的一样。