【问题标题】:Access a subclass from an interface从接口访问子类
【发布时间】:2020-05-29 06:43:39
【问题描述】:

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

组件数组列表中的所有内容都将发送到要渲染的渲染器。我希望能够从 AbstractContainer 类访问 Frame 对象的方法。不用在 Component 接口中声明方法,这可能吗?

【问题讨论】:

    标签: java class hierarchy


    【解决方案1】:

    一个类实现一个接口。一个类扩展另一个类。一个接口扩展另一个接口。这是java中的约定,我在你的问题中提到过你说你的类扩展了接口Component

    Frame<<concrete class>> extends OrganizedContainer extends AbstractContainer extends AbstractComponent implements Component<<interface>>

    现在来回答你的问题。是否可以从 AbstractContainer 类内部访问仅在 Frame 中定义的方法?对的,这是可能的。 如何 ?在父类中,只需对(Frame)this.methodInFrame() 进行类型转换,为了避免this 当前引用的某些其他子类对象,您需要使用instanceof 运算符。所以它就像

     if(this instanceof Frame){
         (Frame)this.methodInFrame();
     }
    

    这是一个好习惯吗?不,根本不,超级类不应该依赖于它的子类。这会增加程序中的耦合并导致维护问题。如果您拥有或计划拥有或将来可能拥有任何更具体的子类怎么办?当您修改Frame 时,您的超类需要修改,因此您新添加的子类可能需要修改。这也会导致可能是运行时问题的问题。当您使用instanceof 时,请注意这是一种代码异味,您必须有充分的理由使用它。

    【讨论】:

      【解决方案2】:

      唯一的方法是检查组件的类型是否为Framecomponent instanceof Frame,然后将组件转换为Frame

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-17
        • 2010-12-19
        • 2015-05-19
        • 1970-01-01
        • 2018-03-13
        • 2018-08-09
        • 1970-01-01
        相关资源
        最近更新 更多