首页 > 解决方案 > 从接口访问子类

问题描述

我有一个名为 Component 的接口的数组列表。还有另一个名为 Frame 的类扩展组件如下:Component(接口)> AbstractComponent(抽象类)> AbstractContainer(抽象类)> OrganizedContainer(类)> Frame(类)

组件 arraylist 中的所有内容都转到要渲染的渲染器。我希望能够从 AbstractContainer 类访问 Frame 对象的方法。如果不在 Component 接口中声明方法,这可能吗?

标签: javaclasshierarchy

解决方案


一个类实现一个接口。一个类扩展了另一个类。一个接口扩展了另一个接口。这是 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注意这是一种代码气味,您必须有很好的理由使用它。


推荐阅读