我有一个超级动物,由Cat,Dog& amp;狮子。这三个都有一个表示声音的字段String sound
。方法playSound(int i,String s)播放声音s,i次数。是否可以在Animal超类中使用一个通用方法来接受调用它的子类的字段?或者我是否必须在每个使用自己的“声音”变量调用super的类中创建一个单独的重写方法?
答案 0 :(得分:6)
超类不能访问子类中的字段。通常的方法是制作一个抽象的getter:
protected abstract Sound getSound();
public void playSound(int times) {
for(int i=0; i<times; i++) {
getSound().play();
}
}
答案 1 :(得分:0)
super不能访问sub的字段,也不应该 - 超类不应该对他们的孩子有依赖性 - 但是由于多态性,它不需要。您需要做的就是给出超级makeSound()
方法或类似方法,然后让子方法覆盖方法,每个方法都播放自己的声音。
重,
或者我是否必须在每个使用自己的“声音”变量调用super的类中创建一个单独的重写方法?
我不明白你的意思是“那叫超级......”。您只需在makeSound()
方法覆盖中调用子调用自己的声音。
答案 2 :(得分:0)
据我所知,不,这是不可能的。您可以尝试在超类中进行比较,如
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);
}
}