问题标签 [class-visibility]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
144 浏览

java - Java模块化项目中如何正确组织接口和实现?

我正在寻找一种在 Java 11 模块化项目中正确组织接口和实现的方法。

考虑最简单的情况:有一个接口及其多个实现。目的是仅将此接口及其工厂方法公开为模块 API。

我的接口.java

MySimpleImpl.java

MyComplexImpl.java

假设根包是org.company.myproject.

所以module-info.java只包含一个导出:exports org.company.myproject;


我看到了几种组织代码的方法,例如明显的是:

版本 1:将实现放入嵌套包中并生成public.

版本 2:将实现放入根包并保留它们package-private

目前我不能更喜欢任何版本,因为第一个迫使我打破模块本身内部的可见性合同,第二个污染了根包,使其意图模糊。

请帮助我理解如何准确地表达我对模块内部和外部模块类可见性的意图。可能有针对这种情况的最佳实践。

0 投票
1 回答
108 浏览

f# - FS0074:通过“C.CRecord”引用的类型在未引用的程序集中定义。您必须添加对程序集“C”的引用

假设我有一个名为“C”的库(.NETStandard 2.0),它定义了一个名为“CRecord”(一条记录)的类型。

假设我从一个名为“B”的 .NET 4.7.2 库中使用这个库。有一个使用“CRecord”类型的“B”类型。

现在假设我有一个名为“A”的可执行 .NET4.7.2 项目,它使用“B”中的类型,但并不真正使用“C”中的组件。

在编译“A”时,你认为你会在下面得到这个编译器错误吗?

错误 FS0074:通过“C.CRecord”引用的类型在未引用的程序集中定义。您必须添加对程序集“C”的引用。(FS0074) (一)

经过大量测试,我开始意识到这个问题的答案是“视情况而定”。关键似乎在于“B”中的类型实际实现的方式。例子:

您会说哪种类型会产生编译器错误?最合乎逻辑的想法是 answer BSimpleRecord,因为它根本不努力隐藏C元素。正确的?正确的????

作为参考,这是 A 和 C 代码(以及返回 B 实例的 B 函数):

好吧,我的 F-sharpers 伙伴们,答案实际上是最不期望的一个:它是当你使用BSimpleRecord时没有得到编译器错误(并且你得到其他两个错误)。

所以我仍然想知道为什么?为什么???我完全不明白这一点。也许这是 F# 编译器中的错误?

0 投票
1 回答
644 浏览

kotlin - Kotlin:如何处理“受保护”属性暴露其内部返回类型

拥有一个基类,我希望它及其后代类仅在内部可见:

在列表的位置Class_A(也可能包含Class_B在其中),希望使其受保护以供其自己的后代类访问此列表

如何让后代类访问某个“内部”类的实例?

0 投票
1 回答
143 浏览

rust - Hack Rust 可见性和隐私

我尝试使用struct不使用pub密钥的外部板条箱中的 a 。

我想最好的解决办法是打开一个 PR,但我的好奇心在这里被触发了。

在 C++ 中,这很容易。我们可以做的:

这将在解析代码时欺骗编译器,因此我们可以访问该类的所有方法/字段。

对 Rust 有任何想法吗?

这是一个具体的例子:

编译错误:error[E0603]: module `internal` is private- 在这个例子中,我们试图导入一个模块而不是一个结构......不确定它是否会改变任何东西。

不幸的是,如果我们不拥有该板条箱,则错误 E0603 的文档并没有真正的帮助。Rust参考中关于可见性和隐私的文档也是如此

0 投票
1 回答
69 浏览

c# - 避免访问嵌套类的构造函数

这是我的问题的粗略代码示例:

我想要完成的事情:

你应该:

  • 如果您从另一个类调用“GetFooChildText1Value”,然后是 FooMaster,则只能到达 Text1
  • 能够访问 FooMaster 中 FooChild1 和 FooChild2 的值和构造函数
  • 无法从 FooMaster 外部调用 FooChild1 或 FooChild2 的构造函数
  • --> 也无法从 FooMaster 外部看到 FooChild1 或 FooChild2 的属性

编辑:

FooChild1 和 FooChild2 类型必须从外部知道,因为您需要能够直接调用各个公共静态方法(我不想制作只调用下一个方法的方法)