在C#或Java中,当子类化时是否可以覆盖私有成员?

9

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

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


2
不是很傻,但你可以尝试五秒钟自己找出答案,所以在这里问没有意义。现在,如果你好奇“为什么语言被定义成那样?”,那就是另外一回事了... - Kilian Foth
8个回答

6
这不是一个愚蠢的问题,而是提供了隐藏变量的另一个概念。 在Java中,字段只被隐藏而不是真正被覆盖(这并不意味着尝试此操作时我们会收到编译时错误,相反,它们并没有真正被覆盖)。 覆盖意味着成员应该根据对象的运行时类型调用,而不是基于已声明类型调用。 但是,在Java中,字段的绑定始终是静态的,因此它仅基于对象引用的声明类型。 在文章“动态绑定与静态绑定”中阅读有关静态绑定的更多信息。
在方法的情况下,只有那些继承的方法被重写,因此静态方法也不会被重写,仅被隐藏,并且它们仅遵循静态绑定。 私有成员(方法或字段)既不被隐藏也不被覆盖。 它们也遵循静态绑定,并且除具有它们的类之外,不能直接从任何其他类(包括子类)访问它们。 请记住,“隐藏”在这里并不意味着我们无法从子类访问成员。 因此,请勿混淆不可访问(对于私有成员-字段或方法的情况)和隐藏。

5

private 方法是类的子类中不可见的,所以它们不会被继承。


5
不,你不能覆盖私有元素,它们实际上是final的(因为从子类中它们从未被看到并进行覆盖)。你可以在子类中声明具有相同名称的私有元素,但这不是覆盖超类中的元素 - 它只是另一个具有与超类中相同名称的私有方法。

4

在IT技术中,使用protected而不是private,这样可以让方法仅对其子类可见。


这非常简单! - BenKoshy

4

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

如果一个子类有一个名称相同的成员变量,并且超类有一个标记为私有的同名成员变量,则它们是两个不同的成员变量。


2
如果超类和子类在同一包中,您可以重写未标记为PRIVATE和FINAL的方法;如果它们在不同的包中,则可以重写PUBLIC或PROTECTED方法(同时它们不应该是FINAL)。请注意保留HTML标签。

1

不,无论是在Java还是在C#中,你都不能覆盖(override)。但是在C++中可以。


1
@hoppeduppeanut 谢谢 - 那是我回答中一个愚蠢的建议。我当时年轻而愚蠢 :) - Rob Grant
在C++中,除非它们是虚函数,否则你也无法覆盖(override)它们! - hiradyazdan

0
答案是不!您可能要考虑使用“protected”关键字。
另请参见,如果与多个程序集一起使用,请使用“internal protected”来处理非方法。
另请参见,例如在基类中的抽象方法,请使用“private protected”。
然后在派生类中,您可以隐藏那些从派生类外部看到的方法。
有一种通过反射或表达式树来实现的方法,但它很明确并且需要一些工作。
您可以像这里here所示的方式类似地处理属性、字段等。
顺便说一句,谁经常使用“final”这个词是一个JAVA迷。 C#中没有“final”关键字,因此您最好使用“sealed”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接