问题标签 [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.
c++ - 与客户共享 C++ DLL 和 H 文件
这是我职业生涯中的第一次,我必须向客户交付一个 DLL,其中包含我们的基础、通用软件和一个接口,使其按照客户想要的方式工作 + 允许客户输入输入并读取输出。
现在我最大的问题是,由于知识产权的原因,我可能不会向我的客户展示他绝对不需要知道的任何内容。这包括数据类型,因此我什至无法向他展示我们任何内部方法的签名。我创建了模仿我们自己内部的数据类型和结构,但例如自愿省略不必要的属性/元素或给它们不同的名称以隐藏对我们私有内部逻辑的提示。然后获取数据的方法映射我们自己的数据结构并输入这些数据。你得到图片。
另外,这一次从纯软件架构的角度来看,我不希望他访问某些成员、属性、变量……因为我不需要他知道它们存在或不想让他在他修改它们时取悦以及他如何取悦。然而,它们仅与该界面相关,根本不是我们内部软件的一部分。
我现在拥有的是一个作为接口的类,他可以实例化它。它基本上提供了用于输出的 get 方法、提供输入和启动更新计算的方法,以及用于其他参数和值(如软件版本或当前状态)的 getter 和 setter。这些参数和其他变量的实际数据变量隐藏在我的 CPP 文件中,该文件被编译到 DLL 中,因此它们甚至没有声明为我们在我给他的 H 文件中用作接口的类的属性,甚至没有作为私人,他不知道他们 - 他只有吸气剂和二传手。
我应该在这里使用什么设计模式?我真的可以把我的变量放在我与客户共享的 H 文件中,作为类的属性,作为 private 吗?但是,他是否能够将它们从私有更改为公共,并通过为类编写新方法、访问它们并自由修改它们而编译器不会抱怨?我能否以其他方式为我的课程做出贡献并将其扩展到我的 CPP 文件或他无法访问的其他 H 文件中?
这么多问题,因为这对我来说都是新的。但是你得到了大致的了解:我想在这个 H 文件中与我的客户分享严格必要的、最少的信息,这样他就可以使我的 DLL 工作并获得他的数据输出。没有更多了。
在此先感谢,查尔斯
class - 只能由其他人更改的类属性的模式
所以假设我有一个 Door 类和一个 Lock 类。Door 类的实例有一个lock
属性,它是 Lock 类的实例。
我希望门“拥有”它是 Lock 的实例,但我不希望门能够更改自己的锁。例如,我不希望这成为可能:
但我确实希望其他班级可以使用门锁。例如,我需要一个 DoorMan 类来锁定和解锁门。因此,这并不像将所有 Lock 属性设为私有那么简单。
有这样做的模式吗?我主要在 PHP 中工作,但答案确实需要特定于语言。提前致谢。
java - 有没有办法限制对对象成员的访问仅限于通过组合拥有它的对象?
我真的觉得必须有办法解决这个问题。
想象一下,我有大量对象作为所有者类的组件。我想为其成员提供对该所有者类的客户的轻松访问,因此我将所有这些对象公开。这些对象中的每一个也都有其所有成员公开。但是组件的一个成员不应被其所有者的客户访问,只能由其所有者自己访问:
有没有办法做到这一点?请注意,任何包中的任何类都可以拥有 a ComponentObject
,因此使用包级别的可见性 atrestricted_to_owner_only
似乎不是一种选择。ComponentObject
就像一个实用程序类,可在其他应用程序中重用。
也许有一个注释可以在编译时在一些不错的库中强制执行?
编辑:我忘了提到 ComponentObject 是现实生活中的参数化类型,并且 Owner 中的每个字段都以不同的方式参数化。我试图抽象出细节,以便我们可以专注于设计问题本身,但我抽象的太多了。我将在下面发布与实际问题更相似的内容:
编辑2(可能是一个解决方案):伙计们,受罗密欧与朱丽叶的爱情启发,我写了这个解决方案,你能发现它有什么问题吗?或者它会按我的意愿工作吗?
这会按预期工作吗?
java - 有效的 Java 条款 13 和 TDD
我刚刚在 Google 上搜索了“Joshua Bloch TDD”... 没有找到太多信息,这真是太遗憾了,因为我真的很想知道他在这件事上要说什么。
第 13 项(我正在看第 2 版)标题为“最小化类和成员的可访问性”。几页后,他说:
为了便于测试,您可能想使类、接口或成员*更易于访问。... 将公共类包的私有成员设为私有以对其进行测试是可以接受的,但是将可访问性提高到更高的水平是不可接受的...幸运的是,这也不是必需的,因为测试可以作为被测试包的一部分运行,从而获得对其包私有元素的访问。
* “成员”是指“字段、方法、嵌套类和嵌套接口”。
作为一个 TDD 新手,但逐渐站稳脚跟,我知道目前的共识似乎是不包括测试类与应用程序代码包,甚至在 src\test 和 src\main 下也没有匹配结构:主要是 TDD专家似乎很容易以其他方式构建他们的测试目录(例如,您有一个名为“unittests”的目录,另一个名为“functionaltests”,另一个名为“e2etests”)。
具体来说,我在“Growing Object Oriented Software by Tests”中关注了拍卖应用的TDD开发。作者毫不犹豫地添加了数百个公共方法。此外,我看了一章后下载的“到目前为止的结构”,他已经完全改变了测试目录结构,将事物划分为测试类别......
是否有任何经验丰富的 TDD 手至少在过去发现这是两难的根源?如果是这样,您是如何解决的?
作为一个实际的例子,我正在通过开发一个 Lucene 索引应用程序来学习 TDD 技术:它索引文档,然后让您查询它们。目前所有的应用程序类都在同一个包中。实际上需要公开的唯一方法是main
在一个类中。然而,当然,我有很多很多公共方法:如果不是因为我使用的是 TDD,它们都可以是包私有的。
PS“方法可见性”没有标签,所以我选择了“类可见性”
之后
看来,我可能被“成长中的面向对象...”中采用的方法引向了一条相当不幸的道路,其中过度使用公共方法可能只是因为它是该技术的演示。哈。
如果您想拆分测试类别,是否有人使用过这种方法:
\src\unit_tests\java\core\MainTest.java
而且,例如:
\src\func_tests\java\core\MainTest.java
和
\src\e2e_tests\java\core\MainTest.java
?
c++ - 如何在 C++ 中伪造“类的可见性”(而不是函数的可见性)?
在 C++中没有控制类的可见性/可访问性的功能。
有没有办法造假?
是否有任何可以模拟最接近行为的 C++ 宏/模板/魔术?
这是情况
Util.h (库)
Bh (图书馆)
Ch (图书馆)
Dh (用户)
我的糟糕解决方案
将所有成员Util
设为私有,然后声明:-
(编辑:感谢ASH “这里不需要前向声明”。)
坏处 :-
- 这是一种
Util
以某种方式识别B
和的修改C
。
在我看来这没有意义。 - 现在 B 和 C 可以访问 的每个成员
Util
,打破任何private
访问保护。
有一种方法可以只为某些成员启用朋友,但它不是那么可爱,并且在这种情况下无法使用。 D
只是不能使用Util
,但仍然可以看到它。在.
Util
_ctrl+spaceD.h
(编辑)注意:这完全是为了编码方便;以防止一些错误或错误使用/更好的自动完成/更好的封装。这与反黑客或防止未经授权访问该功能无关。
(编辑,接受):
可悲的是,我只能接受一种解决方案,所以我主观地选择了一种需要较少工作并提供很大灵活性的解决方案。
对于未来的读者,Preet Kukreti(& texasbruce在评论)和Shmuel H.(& ASH是评论)也提供了值得一读的好解决方案。
html - 为什么此 CSS/HTML 切换显示的浏览器行为“不可预测”?
此代码来自http://jsfiddle.net/8gC3D/471/的 Fiddle 在Tooltip with HTML content without JavaScript的答案中)应该产生一个图像,当悬停在上面时,它会消失并导致另一个元素出现在其他地方页。但这使我的浏览器行为不可预测。有时悬停没有效果,有时是延迟效果,或者只有通过鼠标的一些额外移动才能实现效果等。
为了理解发生了什么,通过简化等(用 ID 代替 CLASSES 等没有效果),我最后用红色背景的 div 代替了 Deviant Art 图像。这种行为只会变得更加疯狂:-
在我的浏览器 (FF) 中,这会在 LHS 页面下方约 82px 处生成一个红色方块。1. 悬停会导致以下三种行为之一: a) 它消失;b) 它消失然后又出现;c) 文字“LOCATZ!!!!” 显示在其下方。2.在红色方块或(不可见)红色方块的位置上进行各种单击或悬停,然后将光标移动到页面的左上角,有时会使红色方块消失,左上角出现一个红色方块角,以及一个距顶部 100 像素和距左侧 300 像素的绿色矩形。这些结果似乎不可预测/不稳定。
代码有什么问题,为什么会让浏览器如此困惑?!?我什至难以获得可重复的行为。
更新
谢谢,Joseph Marikle,很高兴知道,但我正在尝试了解hover
和功能,visibility
而不是实现 Fiddle 的代码。我一直在摆弄代码来尝试这样做,但看不出它有什么“错误”。
java - 如何实现可见性受限的 Java 图形数据结构和类?
我目前正在学习数据结构(例如 LinkedList、DoublyLinkedList、ArrayList...),并且想知道如何在 Java 中实现(非定向)图。
我在考虑两个类:Graph
每个Node<T>
节点都应该知道它连接到哪些其他节点(List<Node<T>>
合适吗?哪种列表最好?)然后Graph
该类可以提供类似的方法boolean contains(T element)
该Node
课程没有其他用途,那么如何限制可见性以便只能Graph
访问?
编辑:此外,我如何权衡节点之间的连接?我想我需要一个与上面提到的完全不同的实现,因为一个简单的连接节点列表是不够的?
python - 无法访问python中的属性
运行此代码时,出现错误“AttributeError:'NoneType' 对象没有属性'test'”
有人可以向我解释一下到底从基地继承了什么?Python 2 和 3 之间似乎存在差异,因为如果我将“test”放在 Baseclass 的属性字段中,我可以在 Python 2 中访问它,但不能在 3 中访问它。
c# - 在 C# 中将实例传递给用户过程时限制方法可见性
我正在尝试定义一个类,其中“我”可以访问所有公共方法,但是当我将实例传递给用户提供的函数时,他们只能访问公共方法的子集。这些方面的东西:
但是,当然,如上所述,用户可以简单地将其重铸为 (MasterClass),然后可以访问 Master 方法。我尝试将 UserClass 放在单独的(用户)命名空间中,但这在对 UserFunction 的调用中遇到了“无法将类型 X 转换为 Y”的编译错误。
我还尝试了使用多个接口实例(IMaster / IUser)的各种方法,但似乎都不起作用,并且尝试使用抽象类(这让我很头疼并且没有产生更好的结果)。
DID 似乎起作用的是在我的代码中定义 MasterClass。然后,我可以在调用 UserFunction 时将其重铸为“(UserClass)”,并且用户将无法看到 Master 方法。但是,考虑到我可能需要(大量?)这样的类,这真的会弄乱我的主程序/文件。我很想知道是否有更好/更好/更容易/(?)的方式来做我想做的事?