问题标签 [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++ 符号导出
我是 Linux、Windows 和 osX 上的 c++ 库的开发人员。由于 osX 现在不能正确处理匿名异常,我考虑清楚地标记需要导出的符号。按照这些解释,我定义了两个宏:FOO_API
和FOO_LOCAL
用于标记符号。现在我有以下问题:
我在自己的文件中定义每个类(因为我不想要 1000 多个长文件)。如果类A
只在我的库中使用,那么用 . 标记它是有意义的FOO_LOCAL
。但是如果 classB
有一个私有成员 type A
,而 class B
is FOO_API
,那么我会收到编译器警告并且链接失败(找不到符号)。这似乎违背了这些出口属性的全部意义。那么,它应该是什么?我用类似这样的东西来标记我的班级class FOO_LOCAL A {...}
是这样吗?
还有没有办法让所有私人成员都在本地?(因为它们是私有的,所以不应该直接访问它们)这将使标记过程不那么乏味......
最后,当我标记例如我的异常类时,它可以正确编译和运行,但显示符号 ( nm -C -D my_lib.so
) 表明所有符号仍然存在......
java - 通过反射在不同包中的类上调用公共方法
我遇到了以下问题。
我在包中有两个不同的包a
我想在包中调用接口的实现方法,b
但实现类具有包可见性。
所以一个简化的代码如下所示:
和调用者:
当我启动程序时,它按预期打印Called
并抛出异常,因为包可见性禁止调用发现的方法。
所以我的问题是有什么办法可以解决这个问题?我是否遗漏了 Java 文档中的某些内容,或者这根本不可能,尽管无需反射就可以简单地调用已实现的方法。
php - 如何在 Symfony 1 中从另一个动作渲染一个动作
我被使用 1.0.17 版的 Symfony 应用程序困住了,目前无法升级。
现在有一个页面包含一个 iframe,它从同一模块加载不同操作的网页。iframe 也导致了一些设计问题和一些用户体验问题,所以我想摆脱它,直接在页面中呈现来自 iframe 的 HTML。
我只是不知道如何执行另一个动作并将视图模板呈现为我可以分配给调用动作视图的变量。
我已经尝试过getPresentationFor()
,但这会导致调用页面上出现 404、异常或致命错误,具体取决于我的尝试方式。
我想我需要把代码放在execute
动作的方法中。控制器是一个sfAction
对象。如果我打电话$this->getController()
,我会得到一个sfWebController
对象。
来电:
结果是空白页;该调用之后的任何代码都不会被执行,但如果我在它之前输出一些东西,我可以在页面上看到它。服务器错误日志中没有错误。
来电:
只是导致我们的 404 页面显示,所以我认为之前的调用更接近我想要的。
有没有办法从另一个动作的代码呈现另一个动作的输出?
谢谢。
java - 包本地类的类文字和 Class.forName 的不同行为
仅举例让我们考虑包中的ClassFileAssembler
类sun.reflect
。
这个类是一个包本地类:
class ClassFileAssembler implements sun.reflect.ClassFileConstants {...
所以我们甚至不能使用它的名字ClassFileAssembler
,我们不能直接导入它——这会导致编译器错误。
sun.reflect
然而,我们可以在我们的项目中创建一个名为的包,并ClassFileAssembler
在该包内部使用该名称 - Java 编译器会认为我们在ClassFileAssembler
's 包内。
如果是这样,为什么不尝试获取对类对象的引用,即ClassFileAssembler.class
?
Class<ClassFileAssembler> classFileAssemblerClass = ClassFileAssembler.class;
出乎意料的是,这段代码会导致运行时错误:java.lang.IllegalAccessError: tried to access class sun.reflect.ClassFileAssembler from class sun.reflect.Test
.
但是我们仍然能够获得ClassFileAssembler
类对象:
它工作正常,并为我们提供了完整的类描述。
所以,问题是:
1)技术之间有什么区别,如何Class.forName0
检索对类对象的引用,以及如何检索.class
?
2)为什么他们有如此不同的安全检查?
3)以这种方式保护.class
参考的原因是什么?
4) 这些技术是否使用不同的类加载器?
php - PHP限制调用公共方法
我正在开发一个库,该库有很多类,这些类都由一个中心类组合在一起。这个中心类必须调用其他类的某些方法来进行设置/配置。这些方法必须是公共的,以便中心类可以调用它们,但我不希望用户调用这些方法(因为它可能会导致不良行为)。
我的一个朋友提出的一个建议是使用带参数的构造函数可以在构造时完成设置。对于这个库来说,这并不容易。有问题的类旨在扩展,如果用户想要拥有自己的构造函数,我不想对构造函数参数施加任何奇怪的要求。更复杂的是,一些用于配置的信息对用户不可用。我必须将其提供给用户,并相信他们会在构建过程中将其路由回正确的类。
目前,我的解决方案是在这些方法前面加上一些东西,并提醒用户不要调用带有上述前缀的方法。这足够“灵活”,可以让我添加更多受限制的方法,但它仍然假设用户将遵循我的指示。它也不是最优雅的解决方案。
我想知道是否有某种方法可以轻松地限制这些方法。我考虑在它们中添加一条线来检查是否是中心类在调用它们,但这似乎也不是最好的解决方案。
编辑:我应该解释这个架构的目的。每个类在一组操作中执行一个特定的任务。中心班级的工作是指挥一个班级执行任务,收集结果,并将结果分发给需要它们的其他班级。然后班级移动到下一个班级并做同样的事情。如何执行任务取决于扩展类。我想要限制的方法是有助于分散结果的方法。我希望这能让我的意图更清楚。
php - 从PHP中的父类调用方法?
我似乎想不出一种方法来调用一个名为insertValue()
;的方法。
我的引导程序获取 url 并将其拆分为多个部分,因此 www.URL.com/register/register 变为
模型类如下
所以数据库类如下
现在,我有一个引导程序,它创建一个扩展控制器的寄存器类,如下所示:
引导程序还通过说它Register->loadModel();
看起来像这样来创建我的模型类:
我根本不知道如何调用 insertValue 函数。我试过$this->model->database->insertValue();
了,但没有用。
PS我注意到当我调用这个函数时,它下面的代码没有被调用,但没有给出错误消息。
java - 是否可以在 Netbeans 的项目视图中显示一个类是公共的还是包私有的?
我的团队希望能够清楚地看到包中的哪些类是公开的。不幸的是,在 Netbeans 项目视图中似乎没有任何视觉指示。有什么方法可以添加我们想要的行为吗?如果没有,插件 API 是否允许我自己编写一个添加此行为的插件?
或者,还有哪些其他解决方案可以对包中类的可见性和依赖项进行基本的高级查看?进入每个班级,检查其可见性并进行“查找用法”并不方便。
c# - 获取 C# 内部类中数组属性的长度,或其他有效的迭代方法?
我有一组由json2charp Web 实用程序从 REST 调用产生的 JSON 响应生成的 C# 类。我使用这些类将未来的 JSON 响应反序列化到这些类中。一切都很好。其中一个内部类具有一个数组属性。我尝试使用数组的Length属性在for 循环中使用该属性,但 Length 属性在当前范围内不可用。我猜这是因为它是一个内部类?
为了解决这个问题,我添加了一个名为CountBreeds的公共属性,它只返回数组 Length。这很好用。但是我想知道是否有一种方法可以获取内部类的数组属性的长度,而不必为了公开数组的长度属性而创建属性?如果没有,有没有办法在不向类添加 IEnumerable 支持的情况下迭代数组?
我知道我可以删除“内部”说明符,但如果可以的话,我想保留它。下面的代码片段:
java - 包保护类中的公共方法有什么理由吗?
我想知道如果方法是公共的或在受包保护的类中受包保护,是否有任何区别。
代替
我想最大的能见度是由班级给出的。而一种方法只能降低可见度,增加可见度没有效果。
但它是有效的语法,所以也许我监督了一些事情?
c# - 使用内部类型(C#)声明公共类方法时出现不一致的可访问性错误?
我有一个 JSON 类对象,它是一个内部类。我想保持这种方式以防止其他代码尝试创建该类型的对象,因为我只希望 JSON 反序列化代码执行此操作。我可以将类类型用作变量,但是如果我尝试返回该类型的对象,则会出现不一致的可访问性编译器错误,因为该方法是public并且类是internal。
解决这种情况的最佳方法是什么?我想我可以为内部类创建一个接口并传递它,但这意味着我必须为我正在使用的每个 JSON 类创建额外的包袱,而且我使用了很多。
编辑:我做了 Jon Skeet 建议的改变,问题就消失了。由于默认情况下将我的课程声明为公共的习惯,我遇到了这个问题。我为其他正在做同样事情的人指出这一点。