覆盖方法中访问修饰符的用途是什么?

时间:2013-03-27 16:45:23

标签: c# override language-design

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

(只是为了澄清:我写这个问题不是因为我认为我比语言设计师更聪明,但因为我确信他们有充分的理由让我无法理解。)

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

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分: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!");
    }
}

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

答案 2 :(得分:1)

为了便于另一位不编写代码的开发人员理解代码。 当你读取覆盖时,你知道你创造了多态性