java - 检查调用对象是否是子类的实例

标签 java oop inheritance polymorphism

我有 2 个类(class)。我们称它们为 A 类和 B 类。A 类包含一个执行某些操作的方法。 B 类用它自己的版本覆盖了这个方法,但确实生成了一个 super调用类 A 中的该方法来执行操作。现在,这工作正常。但是,A 类中的某些操作只有在对象 是 A 类的实例时才应执行。换句话说,如果对象是 A 类的实例,A 类方法中的某些操作不应发生A 类的子实例。

目前,我正在使用 instanceof检查每个 child ,但我需要指定每个子类,因此如果以后添加新的 child ,则需要更新此方法。我想要的是一种确定对象是否为子类的动态方法。

有没有好的替代品,或者是instanceof怎么走?

public class A{

    public void someMethod(){

        // Only perform these actions if it is not a child class.  This is what
        // I am looking for a better solution for
        if(!(this instanceof B)){
            // Some action...
        }

        // Actions to execute for every call
    }
}

public class B extends A{

   @Override
   public void someMethod(){

       super.someMethod();

       // More actions
   }
}

作为对设计的解释,我正在使用它来生成 XML。在程序中,我有一个 List<A>来存储数据。当需要输出 XML 时,我遍历列表并调用 generateXML (someMethod 在我的示例中占据了它的位置)。

创建类 A 的对象时,它的数据需要在 <A></A> 内标签。创建 B 类对象时,它的数据需要在 <B></B> 内标签。但是 A 的所有属性也必须在 <B></B> 内标签,所以现在它调用相同的 generateXML当对象仅属于类 A 时使用的方法

但正如其他一些人所指出的那样,调用相同的方法并不是可行的方法。类 B应该在类 A 中调用 protected 方法只生成必要的信息。

最佳答案

创建 protected 方法来执行类特定的事情,并从 someMethod() 调用它们。 A 类将提供其实现,如果子类需要有效地删除该代码,则它可以使用空实现覆盖 protected 方法。

不要对抗多态性;充分利用它。

例子:

public class A {
    protected void someOtherMethod() {
        // Do stuff specific to A here.
    }

    public void someMethod() {
        // Do some stuff

        someOtherMethod();

        // Do some more stuff
    }
}

public class B extends A {
    @Override
    protected void someOtherMethod() {
        // Empty implementation; B doesn't need to do this.
        // Or do stuff specific to B...
    }
}

关于java - 检查调用对象是否是子类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6795442/

相关文章:

java - 致命异常 : OkHttp Dispatcher

java - Thymeleaf 中的多维数组搜索?

PHP - 静态类和缓存类

c++ - 为什么这种打破封装的方式在 C++ 中起作用?

c++ - 在类定义中使用内置数组,但将大小推迟到派生类会导致隐藏吗?

java - 是否有 "best"方法从静态方法调用类方法?

c# - OOP - 关于 DDD 的私有(private)字段或私有(private)属性 setter

java - 如何计算运行时选择的类型 "object"

java - 多级继承

java - 如何在 mongoDB 文档字段中保留特殊键并删除其中多余的键?