繁体   English   中英

在子类中已被重写的超类中使用方法,具体取决于调用它的对象的类型

[英]Use of method in superclass that has been overridden in a subclass, depending on the type of the objects that call it

我正在寻找一种方法来调用(重写的)方法的不同定义,具体取决于正在调用该方法的对象的类型。 当我强调以下几点时,这应该更有意义。

我有两个定义如下的类:

public class SuperClass{

     public method1(){
           if (objects are of type SuperClass and not SubClass){ //pseudocode
                method2();
           }
           //do some more stuff
     }

     public method2(){
         //do stuff
     }
}

public class SubClass extends SuperClass{

     @Override
     public method1(){
          method2();
          super.method1();
     }

     @Override
     public method2(){
         //do stuff
     }

}

在这两个类中,我正在处理3个对象,分别称为dogcatbird dogcat都是SuperClass类型的SuperClass ,而birdSubClass类型的对象。

您会注意到所有对象都遵循代码中的相同基本过程,在执行其他操作之前,它们的method1()调用method2() 它们之间的区别显然是SubClass覆盖了method2()bird具有不同的method2()

目前,我的代码正在按我的要求工作,但是我正在寻找一种更优雅的解决方案(如果有)。 您可以从上面的代码中看到如何解决当前的问题:在SuperClass我基本上检查对象是否为SuperClass类型。 在我的实际程序中,伪代码行看起来更像这样(仍然是“伪代码”):

 if(this.toString().equals("Dog") || this.toString().equals("Cat")){
      method2();
 }

在调用method1()的原始定义之前, bird调用了它自己的method2()定义。 基本上,这两个类都处理他们自己的method2()的局部定义。

我更优雅的想法如下:完全从SubClass删除method1()的重写的定义,并能够在适当的时间(即当我正在处理的对象时method2()SuperClass内调用method2()的重写的定义。是bird )。

我基本上完全按照我写的方法尝试了上面的方法,但是该bird对象最终使用SuperClassmethod2()而不是SubClassmethod2()进行了定义。

可以这样做吗?

您不应该在超类方法中检查类型。 不适用于发布的难看的toString()方法,也不适用于instanceof 让多态为您工作。

多态的整个概念是,您可以在超类类型上调用方法,并且对象将像其实际类型一样工作。 标准教科书示例如下所示:

Cat cat = new Cat();
Animal animal = cat;
animal.speak();

想象一下,您没有看到animal = cat任务。 你只有一只Animal 您不知道它是猫,狗还是大象,只知道有说话的方法。 由于多态性,该对象将根据其实际类型运行,而无需检查内部类型。

继承和重写完全按照您想要的方式工作,而无需检查实例是父类还是子类。

做就是了,

public class SuperClass{
     public method1(){
         method2(); // Note that you don't need any instance check here.
         //do some more stuff
     }

     public method2(){
         SOP("Super method2");
     }
}

public class SubClass extends SuperClass{
     @Override
     public method2(){ // Note that you don't have to override method1
         SOP("SUB method2")
     }
}

在这种情况下,如果使用Super类对象调用method1() ,它将调用超类的method2()并打印Super method2

如果使用Sub类对象调用method1() ,它将调用子类的method2()并打印Sub method2

您可以使用instanceOf()方法检查对象是否是另一个类的实例。 但是,这对于所有超级类也将返回true。

但是我相信您在说的是,如果子类重写了子类,则希望它们调用它们自己的方法版本。 由于多态,这将自动发生

为了根据调用该方法的对象的类型调用方法的不同定义,您可能会进行重载,这就是它的工作方式

如果找到合适的函数,则调用该函数。 在此上下文中,“适用”表示以下内容之一:•找到了完全匹配的内容。 •执行了一次简单的转换。 •进行了整体推广。 •存在到所需参数类型的标准转换。 •存在对所需参数类型的用户定义的转换(转换运算符或构造函数)。 •找到了用省略号表示的参数。

编译器为每个参数创建一组候选函数。 候选函数是可以将该位置的实际参数转换为形式参数的类型的函数。 为每个参数构建一组“最佳匹配函数”,并且所选函数是所有集合的交集。 如果相交包含多个功能,则重载不明确并生成错误。 对于至少一个参数,最终选择的功能总是比组中的其他功能更好地匹配。 如果不是这种情况(如果没有明确的获胜者),则函数调用将产生错误。

暂无
暂无

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

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