1

如果我不更改它,为什么在 C# 中我需要指定要覆盖的方法的访问修饰符?在这种情况下根本不指定任何访问修饰符不是更简单、更合乎逻辑吗?

(澄清一下:我写这个问题不是因为我认为我比语言设计师更聪明,而是因为我确信他们有一个我还不能理解的充分理由。)

编辑:我不是在问为什么我们不能更改访问修饰符,而是在问为什么我们必须冗余地指定它。

4

3 回答 3

6

虽然我不是语言设计者之一,但我认为强迫你指定它是完全合理的:

  • 任何阅读代码的人都会立即知道访问权限,而无需检查原始声明
  • 对原始声明的访问的更改是这种方式的重大更改,使覆盖代码更加明显
  • 它使一个方法恰好覆盖了与非覆盖方法一致的更高声明。(如果一个没有访问修饰符的方法有时是公共的,有时是私有的,这会很奇怪,这取决于覆盖。)

基本上,冗余有时是一件好事:)

于 2013-03-27T16:48:26.370 回答
2

为了说明 Jon 在代码中的观点,请考虑以下内容:

class LevelOne
{
    public virtual void SayHi()
    {
        Console.WriteLine("Hi!");
    }
}
class LevelTwo : LevelOne
{
    override void SayHi()
    {
        Console.WriteLine("Hi!");
    }
}
class LevelThree : LevelTwo
{
    override void SayHi()
    {
        Console.WriteLine("Hi!");
    }
}

无穷无尽。现在假设您处于派生类的 n 深度,您必须一直遵循继承层次结构回到原始基类以找出方法的访问修饰符。这简直太烦人了!

于 2013-03-27T16:53:49.703 回答
1

为了便于其他不编写代码的开发人员理解代码。当您阅读覆盖时,您知道您进行了多态性

于 2013-03-27T16:48:18.220 回答