【发布时间】:2024-01-21 19:18:01
【问题描述】:
假设我们有一个接口A,由B类实现:
public interface A {
public int getValueForName(String name);
}
public class B implements A {
public int getValueForName(String name) {
//implementation
}
public String getNameForValue(int value) {
//implementation
}
}
如果程序员在每次引用B 的实例时始终使用A 类型,那么在B 中定义但在A 中未指定的任何方法(例如getNameForValue())都会被隐藏并且无法访问通过任何包含A 类型引用的代码。
这种方法似乎有一个致命的缺陷。一段引用B(类型为A)实例的代码如何访问getNameForValue()?
【问题讨论】:
-
为什么任何想要
A的代码都需要执行m。A本质上明确地将m排除在任何想要A的人的知识之外——这就是重点。任何想要A的人都不应该关心除A定义之外的任何事情...... -
哇,哇,为什么会被搁置?对此有一个完全合理的答案,我觉得这源于对接口提供的内容的误解。 Edit:元讨论can be found here.
-
@MadProgrammer:这如何明确排除
m,因为如果我们在B类中编写一个方法,那么它应该在接口A中定义。对吧? -
@bddesai89 我试图找到一种表达方式。但是任何期望
A的东西都只期望A定义的东西,它永远不应该关心B或B定义的东西超出了它与A的联系,因此,A明确排除了任何未定义的东西A来自那些想与A合作的知识... -
您评论中的代码编译并运行良好,但该代码与您的问题有什么关系?如果它是
main(String args[]) { A b = new B(); b.m(); },这将是相关的。这不会编译,因为b只知道实现A,而不是具体的B对象。