我有一个超类动物,由Cat, Dog & Lion扩展。这三个人都有一个代表他们声音的场String sound
。方法playSound(int i, String s)播放声音s,i的次数。是否有可能在动物超类中有一个通用方法,该方法接受调用它的子类的字段?还是我必须在每个类中创建一个单独的覆盖方法,该方法使用自己的"声音"变量调用super?
超类无法访问子类中的字段。这里通常的方法是制作一个抽象的getter:
protected abstract Sound getSound();
public void playSound(int times) {
for(int i=0; i<times; i++) {
getSound().play();
}
}
无法访问子类的字段,也不应该 - 超级类不应该依赖于它们的子类 - 但由于多态性,它不需要。您需要做的就是给super一个makeSound()
方法或类似的东西,然后让sub的覆盖该方法,每个方法都播放自己的声音。
再
还是我必须在每个类中创建一个单独的覆盖方法,该方法使用自己的"声音"变量调用super?
我不明白你说的"那叫超级......"是什么意思。您只需让 sub 在 makeSound()
方法覆盖中调用自己的声音即可。
据我所知,不,这是不可能的。您可以尝试在超类中进行比较,例如
if (this intanaceof of Cat)
play cat sound
但这会有点违背多态性的目的。我不明白你为什么要这样做。我会做这样的事情:
abstract class Animal{
Sound [] sounds;
int soundI;
Animal(int soundI){
this.soundI = soundI
}
void playSound(){
sounds[i].play();
}
}
class Cat extends Animal{
Cat(){
super(5);
}
}