从接口访问子类
Access a subclass from an interface
我有一个名为 Component 的接口的数组列表。还有一个class命名的Frame扩展组件如下:Component(接口)> AbstractComponent(抽象class)> AbstractContainer(抽象class)> OrganizedContainer(class)>框架 (class)
组件数组列表中的所有内容都将进入渲染器进行渲染。我希望能够从 AbstractContainer class 访问 Frame 对象的方法。如果不在 Component 接口中声明方法,这是否可行?
唯一的方法是检查组件的类型是否为 Frame
和 component instanceof Frame
,然后将组件转换为 Frame
。
一个Class实现一个接口。一个 Class 扩展 另一个 Class。一个接口扩展另一个接口。这是 java 中的约定,我在你的问题中提到你说你的 class 扩展了接口 Component
.
Frame<<concrete class>> extends OrganizedContainer extends AbstractContainer extends AbstractComponent implements Component<<interface>>
现在回答你的问题。是否可以从 AbstractContainer
Class 内部访问仅在 Frame
中定义的方法?是的,有可能。
如何 ?在父级中,只需对 (Frame)this.methodInFrame()
进行类型转换并避免某些其他子 class 对象当前被 this
引用,您需要使用 instanceof
运算符。所以就像
if(this instanceof Frame){
(Frame)this.methodInFrame();
}
这是一个好习惯吗?一点也不,Super class 不应该依赖于它的 sub classes。这会增加程序中的耦合并导致维护问题。如果您拥有或计划拥有或将来可能拥有任何更具体的子 classes 怎么办?当您修改 Frame
时,您的超级 classes 需要修改,因此您新添加的 subclasses 可能需要修改。这也会导致可能是运行时问题的问题。当您使用 instanceof
请注意,这是一种代码味道,您必须有充分的理由使用它。
我有一个名为 Component 的接口的数组列表。还有一个class命名的Frame扩展组件如下:Component(接口)> AbstractComponent(抽象class)> AbstractContainer(抽象class)> OrganizedContainer(class)>框架 (class)
组件数组列表中的所有内容都将进入渲染器进行渲染。我希望能够从 AbstractContainer class 访问 Frame 对象的方法。如果不在 Component 接口中声明方法,这是否可行?
唯一的方法是检查组件的类型是否为 Frame
和 component instanceof Frame
,然后将组件转换为 Frame
。
一个Class实现一个接口。一个 Class 扩展 另一个 Class。一个接口扩展另一个接口。这是 java 中的约定,我在你的问题中提到你说你的 class 扩展了接口 Component
.
Frame<<concrete class>> extends OrganizedContainer extends AbstractContainer extends AbstractComponent implements Component<<interface>>
现在回答你的问题。是否可以从 AbstractContainer
Class 内部访问仅在 Frame
中定义的方法?是的,有可能。
如何 ?在父级中,只需对 (Frame)this.methodInFrame()
进行类型转换并避免某些其他子 class 对象当前被 this
引用,您需要使用 instanceof
运算符。所以就像
if(this instanceof Frame){
(Frame)this.methodInFrame();
}
这是一个好习惯吗?一点也不,Super class 不应该依赖于它的 sub classes。这会增加程序中的耦合并导致维护问题。如果您拥有或计划拥有或将来可能拥有任何更具体的子 classes 怎么办?当您修改 Frame
时,您的超级 classes 需要修改,因此您新添加的 subclasses 可能需要修改。这也会导致可能是运行时问题的问题。当您使用 instanceof
请注意,这是一种代码味道,您必须有充分的理由使用它。