【问题标题】:How to "override" field's scope in an inherited class?如何在继承的类中“覆盖”字段的范围?
【发布时间】:2017-05-29 20:52:26
【问题描述】:

我有一些具有“受保护”范围的字段的通用类。是否可以在继承的类中覆盖或覆盖这个范围?这是我的通用(扩展)类的示例:

public abstract class BaseDAO<T extends Entity> {

protected MongoClient client;
protected MongoCursor<Document> cursor; }

那么,如果最具体的话,如何在我的继承类中将“受保护”更改为“私有”?

Google 不理解我的请求并提供有关继承的最基本教程,但没有回答我的问题。也试图在这里搜索一些标签,比如“java范围覆盖”等等。没用。

感谢您的反馈!

【问题讨论】:

  • 你不能……就这么简单。
  • 如果您在子类中重新声明字段,您将隐藏而不是覆盖(请参阅:stackoverflow.com/questions/9414990/…)。在方法方面,只能增加可见性(例如保护为公共),不能减少(保护为私有)。
  • 是的,我知道 super.fieldName 和 just fieldName 是不同的变量。但你还是回答了我的问题,谢谢!

标签: java inheritance scope overriding


【解决方案1】:

这是不可能的,并且不会尊重Liskov substitution principle,因为您的继承类会“隐藏”该字段(即您的继承类无法与 BaseDAO 无缝交换)。

【讨论】:

  • 那么,在继承者中创建私有字段的唯一方法就是不继承这些字段,对吗?
  • 不确定您的意思。您的子类将始终继承父字段,对此您无能为力。但是你绝对可以在你的子类中添加私有字段。
【解决方案2】:

您已经收到正确的答案。你不能降低可见度,只能增加它。 (正如@d.j.brown 所说)

因此您可以覆盖父方法并提高对public 的可见性,但不能将其降低到private

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多