【问题标题】:Why can't sub-packages see package private classes?为什么子包看不到包私有类?
【发布时间】:2023-03-17 09:46:01
【问题描述】:

好的,我有这个项目结构:

包 A.B

  • class SuperClass(这个类被标记为包私有)

包装 A.B.C

  • SubClass(继承自超类)

我宁愿不让 SuperClass 公开可见...它实际上只是这个特定项目 (A.B) 的实用程序类。

在我看来,SubClass 应该可以看到SuperClass,因为包 A.B.C 是 A.B 的子包……但事实并非如此。

解决此问题的最佳方法是什么?我认为将 A.B.C 中的所有内容移至 A.B 或将 A.B 移至 A.B.C 是没有意义的……主要是因为可能会有一个 A.B.D 也继承自 A.B 中的东西……

我对 Java 有点陌生,所以请客气 :D(我是 C++ 和 .NET 专家)

【问题讨论】:

    标签: java inheritance packages organization


    【解决方案1】:

    为什么不把它们放在同一个包级别?

    你能以某种方式使用组合而不是继承吗?在阅读了 Effective Java 之后,我一直在尝试自己做更多的事情。鉴于您的需要,不确定这是否可行,但可能值得考虑。

    祝你好运。

    【讨论】:

    • 我不希望它们在同一个包级别,因为我将有大约 20 到 30 个依赖于超级类的类,我正在努力让事情井井有条,哈哈。跨度>
    【解决方案2】:

    最好的办法是将SuperClass 的(默认)构造函数声明为protected。这样,只有同一个包中的类和子类,无论包如何,都可以实例化它并从中扩展。

    【讨论】:

      【解决方案3】:

      包是唯一的标识符。你不能让它们遵循继承规则。 Package 和 SubPackage 与 Super 和 Sub 类不同。

      我看不出让你想在子包中使用的类对外界可见有任何缺陷。我很想知道这个标准在 C++/.net 中是如何处理的(因为我是一个 java 人:))

      【讨论】:

      • 是的,我有点想我只是误解了包
      • 在 .NET 中,我只需将类放在文件夹中并将它们标记为内部 :)
      • 我没有得到与继承相关的类比。包是命名空间。命名空间根据定义是分层的。 Java 的包私有类在子包中不可见是完全错误的。
      • @AlexandruNedelcu - “命名空间根据定义是分层的” - 不符合 java.
      猜你喜欢
      • 2019-03-15
      • 1970-01-01
      • 2021-04-29
      • 2021-10-01
      • 2018-11-08
      • 2011-02-09
      • 2014-09-26
      • 2022-12-21
      • 1970-01-01
      相关资源
      最近更新 更多