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

com*_*uru 4 java oop polymorphism inheritance

我有2节课.我们称它们为A类和B类.A类包含一个执行某些动作的方法.B类使用自己的版本覆盖此方法,但会super在A类中调用该方法来执行操作.现在,这工作正常.但是,在A类中有一些操作只应在对象只是 A类的实例时执行.换句话说,如果对象是Class的子实例,则不应该发生A类方法中的某些操作.一个.

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

有什么好的选择,还是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
   }
}
Run Code Online (Sandbox Code Playgroud)

就像对设计的解释一样,我用它来生成XML.在程序中,我有一个List<A>存储数据.当需要输出XML时,我遍历列表并调用generateXML(someMethod在我的示例中取代它).

创建A类对象时,需要在<A></A>标记中包含其数据.创建B类对象时,需要在<B></B>标记中包含其数据.但是所有的属性A也必须在<B></B>标记内部,所以现在它调用的generateXML对象只有一个对象时才使用A

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

cdh*_*wie 7

创建执行特定于类的事物的受保护方法,并从someMethod()调用它们.A类将提供其执行情况,如果一个子类需要有效地去除该代码,那么就可以用空的实现覆盖保护的方法.

不要打多态; 使用它对你有利.

例:

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...
    }
}
Run Code Online (Sandbox Code Playgroud)