[英]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个对象,分别称为dog
, cat
和bird
。 dog
和cat
都是SuperClass
类型的SuperClass
,而bird
是SubClass
类型的对象。
您会注意到所有对象都遵循代码中的相同基本过程,在执行其他操作之前,它们的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
对象最终使用SuperClass
的method2()
而不是SubClass
的method2()
进行了定义。
可以这样做吗?
您不应该在超类方法中检查类型。 不适用于发布的难看的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.