java - 从接口访问子类
问题描述
我有一个名为 Component 的接口的数组列表。还有另一个名为 Frame 的类扩展组件如下:Component(接口)> AbstractComponent(抽象类)> AbstractContainer(抽象类)> OrganizedContainer(类)> Frame(类)
组件 arraylist 中的所有内容都转到要渲染的渲染器。我希望能够从 AbstractContainer 类访问 Frame 对象的方法。如果不在 Component 接口中声明方法,这可能吗?
解决方案
一个类实现一个接口。一个类扩展了另一个类。一个接口扩展了另一个接口。这是 java 中的约定,我在你的问题中提到过你说你的类扩展了接口Component
。
Frame<<concrete class>> extends OrganizedContainer extends AbstractContainer extends AbstractComponent implements Component<<interface>>
现在来回答你的问题。是否可以从AbstractContainer
类内部访问仅在中定义的方法Frame
?对的,这是可能的。如何 ?在父类中,只需对 and 进行类型转换(Frame)this.methodInFrame()
,为了避免当前引用的其他一些子类对象this
,您需要使用instanceof
运算符。所以它就像
if(this instanceof Frame){
(Frame)this.methodInFrame();
}
这是一个好习惯吗?一点也不,超级类不应该依赖于它的子类。这会增加程序中的耦合并导致维护问题。如果您有或计划有或将来可能有任何更具体的子类怎么办?当您修改Frame
您的超类时,您的超类需要修改,因此您新添加的子类可能需要修改。这也会导致可能是运行时问题的问题。每当您使用时,请instanceof
注意这是一种代码气味,您必须有很好的理由使用它。
推荐阅读
- javascript - JavaScript WebSocket 用新套接字替换引用
- python - 匹配正则表达式模式,其中开始和结束模式之间有 \n\r
- tensorflow - 在张量流估计器中复制结果
- javascript - JavaScript 警报显示“未定义”
- swift - startMonitoringSignificantLocationChanges 在静止时触发
- laravel - Guzzle Http 未使用 Monolog 登录 Laravel
- c - 我对 C 编程有点陌生。我需要帮助将文件(test.txt)中的字符串推送到不带逗号的数组中
- bittorrent - 带有身份验证的bittorrent webseed
- c - 为数组中的一个线程调用两次线程入口点
- javascript - 选择单选按钮时如何恢复嵌入式 mp4 视频的播放?