【问题标题】:What's the purpose of access modifier in overriden method?覆盖方法中访问修饰符的目的是什么?
【发布时间】:2013-03-17 20:48:27
【问题描述】:

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

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

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

【问题讨论】:

标签: c# overriding language-design


【解决方案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!");
        }
    }
    

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

    【讨论】:

    • 编译器给出错误you can't change access rights,这正是我想在答案中显示的。奇怪的是它收到了很多dv。可能我表达的不够清楚。
    • @IlyaIvanov 我的问题是关于在覆盖方法中缺少访问修饰符表示父级访问级别而不是内部访问级别的假设情况。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2014-09-14
      • 2015-11-27
      • 2012-05-05
      • 2012-11-07
      • 2017-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      相关资源
      最近更新 更多