【问题标题】:Is it possible to override a private member when subclassing in C# or Java?在 C# 或 Java 中进行子类化时是否可以覆盖私有成员?
【发布时间】:2011-11-21 11:12:50
【问题描述】:

我正在学习 C# 和 Java,有一个关于继承的问题。

是否可以覆盖超类(基类)中的私有成员?在我看来,这是不正确的,因为访问修饰符会阻止成员被访问。

【问题讨论】:

  • 不傻,但是你可以通过尝试在五秒钟内找到自己,因此在这里问tit没有意义。现在,如果您对“为什么语言是这样定义的?”感到好奇,那就另当别论了……

标签: c# java oop inheritance


【解决方案1】:

这不是一个愚蠢的问题,但它给出了隐藏变量的另一个概念。

Java 中的字段只是隐藏的,实际上并没有被覆盖(这并不意味着我们在尝试此操作时会遇到编译时错误,而是在真正意义上它们没有被覆盖)。覆盖意味着应该基于对象的运行时类型而不是基于声明的类型来调用成员。但是 Java 中的字段绑定始终是静态的,因此它仅基于对象引用的声明类型。在文章中阅读有关静态绑定的更多信息 - 动态绑定与静态绑定 >>

在方法的情况下,只有那些被继承的方法被覆盖,因此静态方法也不会被覆盖,而只是隐藏,它们只遵循静态绑定。私有成员(方法或字段)既不隐藏也不被覆盖。它们也遵循静态绑定,除了拥有它们的类之外,不能从任何其他类(包括子类)直接访问它们。请记住,隐藏并不意味着我们不能访问子类中的成员。所以,不要混淆不可访问(在私有成员的情况下 - 字段或方法)和被隐藏。

【讨论】:

    【解决方案2】:

    private 类的方法在其子类中可见,因此它们不会被继承。

    【讨论】:

      【解决方案3】:

      不,您不能覆盖 private 元素,它们实际上是最终的(因为它们永远不会从要覆盖的子类中看到。)

      您可以在子类中声明具有相同名称的 private 元素,但这不会覆盖超类中的元素 - 它只是另一个与超类中同名的 private 方法。

      【讨论】:

        【解决方案4】:

        从技术上讲,您并没有覆盖它。

        如果子类有一个有名字的成员,而超类有一个同名的成员被标记为私有,那么它们是两个不同的成员。

        【讨论】:

          【解决方案5】:

          如果同一个包中的超类和子类都可以覆盖未标记为 PRIVATE 和 FINAL 的方法,如果它们位于不同的包中,那么您可以覆盖 PUBLIC 或 PROTECTED 的方法(它们也应该`不是最终的)。

          【讨论】:

            【解决方案6】:

            使用 protected 代替 privated ,受保护的方法只对他的孩子可见

            【讨论】:

            • 就是这么简单!
            【解决方案7】:

            不,您不能覆盖 JavaC#。您可以在C++ 中进行操作。

            【讨论】:

            • @hoppeduppeanut 谢谢 - 这是我回答中的一个愚蠢的建议。我年轻而愚蠢:)
            • 你也不能在 C++ 中覆盖,除非它们是虚函数!
            【解决方案8】:

            答案是否定的!您可能需要考虑使用“受保护”关键字。

            如果使用多个程序集,另请参阅非方法的“内部保护”。

            另请参阅“private protected'”,了解基类中的抽象方法。

            然后在您的派生类中,您可以隐藏那些在派生类之外的方法。

            有一种方法可以通过反射或表达式树来实现,但它是显式的,需要一些工作。

            您可以使用属性、字段等类似地执行此操作...如 here 所示。

            顺便说一句,一直使用“final”这个词的人都是 JAVA 书呆子。 C# 中没有“final”关键字,因此最好的选择是使用“sealed”。

            【讨论】:

              猜你喜欢
              • 2015-12-11
              • 2016-12-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-10-09
              • 2020-10-30
              相关资源
              最近更新 更多