繁体   English   中英

多态性 - 如何检查超类是否是子类?

[英]Polymorphism - how to check if a superclass is a subclass?

这是我的代码:

public class WriteReviewController {
    
    private OverviewActivity overviewActivity;
    private WriteReviewActivity writeReviewActivity;
    ...
    
    public WriteReviewController(AppCompatActivity appCompatActivity) {
                if (appCompatActivity.getClass().isAssignableFrom(OverviewActivity.class))
                    this.overviewActivity = (OverviewActivity) appCompatActivity;
                else if (appCompatActivity.getClass().isAssignableFrom(WriteReviewActivity.class))
                    this.writeReviewActivity = (WriteReviewActivity) appCompatActivity;
            }
    }

这是我的应用程序的 controller。 我想检查参数appCompatActivityOverviewActivity还是WriteReviewActivity 这个方法将被这两个活动调用,只是作为参数传递this

这个检查是否正确或者我应该使用instaceof而不是isAssignableFrom

大多数情况下应该使用instanceof ,不需要手动调用isAssignableFrom 如果您处理Class对象,则应该这样做,但在这里您有实例本身。

因此,使用instanceof您的代码将如下所示:

public class WriteReviewController {

    private OverviewActivity overviewActivity;
    private WriteReviewActivity writeReviewActivity;
    //...

    public WriteReviewController(AppCompatActivity appCompatActivity) {
        if (appCompatActivity instanceof OverviewActivity)
            this.overviewActivity = (OverviewActivity) appCompatActivity;
        else if (appCompatActivity instanceof WriteReviewActivity)
            this.writeReviewActivity = (WriteReviewActivity) appCompatActivity;
        }
    }
}

更简洁的代码是编写两个构造函数:

public class WriteReviewController {

    private OverviewActivity overviewActivity;
    private WriteReviewActivity writeReviewActivity;
    //...

    public WriteReviewController(OverviewActivity overviewActivity) {
        this.overviewActivity = overviewActivity;
    }

    public WriteReviewController(WriteReviewActivity writeReviewActivity) {
        this.writeReviewActivity = writeReviewActivity;
    }
}

但是只有当这是您想要实例化WriteReviewController的仅有的两种方式时,您才应该这样做。 您的代码允许传递既不是OverviewActivity也不是WriteReviewActivityAppCompatActivity ,因此行为不一样,我只是提到这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM