访问超类方法中的变量

4

我有一个包含动物类、狗和猫子类的基础代码。我有一个speak方法,该方法接收一个字符串,并以猫和狗的“语言”返回一个字符串。如果一个字符的ascii码是偶数,则返回“uff”,否则返回“vau”。当我覆盖这个方法时,我想从Dog类中设置oddSound和evenSound,但我找不到合适的方法来实现这一点。
这是Animal类的代码:

public String speak(String what){
    String speakableString = new String();
    String oddSound = new String();
    String evenSound = new String();

    for (int i = 0; i < what.length(); i++) {
        if((((int) what.charAt(i)) & 1) == 1){ 
            speakableString.concat(oddSound); 
        }else if ((((int) what.charAt(i)) & 1) == 0){
            speakableString.concat(evenSound);
        }
    }

    speakableString = speakableString.substring(0, speakableString.length()-1);
    return speakableString;
}

这段代码来自Dog类:

public String speak(String what){
    //set oddSound = "vau"
    //set evenSound = "uff"
    return super.speak(what);
}

2
.concat() 不会改变任何东西。 - SLaks
如果在修复.concat()语句后问题仍然存在,请发布相关的继承代码。 - Kalle Richter
这不是一个解决错误的问题。我将通过编辑问题来尝试使其更清晰明了。 - Dora Herbert
@mattm 这实际上是个好主意。你能详细解释一下吗? - Dora Herbert
@SLaks 我编辑了代码,我认为现在 concat 方法的作用更清晰了。 - Dora Herbert
显示剩余2条评论
4个回答

1
在Animal类中,有两个受保护的字段,其中一个是Animal
protected String oddSound;
protected String evenSound;

然后,在 DogCat 类中,您可以设置这些字段:

oddSound = "woof";
evenSound = "woofwoof"

然后,在speak()方法中,你可以简单地使用this.oddSoundthis.evenSound

我怎么能从 Animal 访问 Cat 的私有变量呢? - Dora Herbert
实际上,这完全回答了我的问题,但另一个答案更“友好”。 - Dora Herbert

0
Animal类应该声明你的speak方法,因为这对于Dog和Cat类都是共同的。
public class Animal {
    String oddSound;
    String evenSound;

    public Animal(String oddSound, String evenSound) {
        this.oddSound = oddSound;
        this.evenSound = evenSound;
    }

    public String speak(String what){
        String speakableString = new String();

        for (int i = 0; i < what.length(); i++) {
            if((((int) what.charAt(i)) & 1) == 1){ 
                speakableString = speakableString.concat(oddSound); 
            }else if ((((int) what.charAt(i)) & 1) == 0){
                speakableString = speakableString.concat(evenSound);
            }
        }

    speakableString = speakableString.substring(0, speakableString.length()-1);
    return speakableString;
    }
}

请记住,string.concat方法创建一个对象,它不会修改调用它的实例。请参阅String API文档

您的Dog和Cat类应该仅在需要时定义或覆盖方法。在它们的speak方法中似乎只是调用了超级方法的实现。您可以完全摆脱它。

如果您想扩展Animal类以提供新的方法或实现,请按照以下方式进行:

public class Dog extends Animal {
    public Dog() {
        // This calls the super constructor, which sets the oddSound and evenSound fields
        super("vau", "uff");
    }

    // This section does nothing.
    // A method implementation which only calls its super implementation is ineffective.
    // If you were to provide a new implementation, this is where it would be.
    //public String speak(String what) {
    //  super.speak(what);  
    //}
}

0
你可以将它们作为数据成员保留,并在相应的构造函数中设置它们。
public class Animal {
    private String oddSound;
    private String evenSound;

    protected Animal (String oddSound, String evenSound) {
        this.oddSound = oddSound;
        this.evenSound = evenSound;
    }

    public String speak(String what){
        String speakableString = new String();

        for (int i = 0; i < what.length(); i++) {
            if((((int) what.charAt(i)) & 1) == 1){ 
                speakableString = speakableString.concat(oddSound); 
            }else if ((((int) what.charAt(i)) & 1) == 0){
                speakableString = speakableString.concat(evenSound);
            }
        }
}

public class Dog extends Animal {
    public Dog() {
        super ("uff", "vau");
    }
}

-1
你可以将你的说话实现分成两部分,以便你可以传入想要用于oddSoundevenSound的字符串。
public String speak(String what){
    return getSpeakableString(what, new String(), new String());
}
protected String getSpeakableString(String what, String oddSound, String evenSound){
    //this is just copied from what you had in your question, it likely doesn't do what you actually want.
    String speakableString = new String();
    for (int i = 0; i < what.length(); i++) {
        if((((int) what.charAt(i)) & 1) == 1){ 
            speakableString.concat(oddSound); 
        }else if ((((int) what.charAt(i)) & 1) == 0){
            speakableString.concat(evenSound);
        }
    }
    speakableString = speakableString.substring(0, speakableString.length()-1);
    return speakableString;
}

//in subclass
@Override
public String speak(String what){
    return getSpeakableString(what, "vau", "uff");
}

是的,这是我第一次做练习时所做的。但我的老师说这不是最好的方法,我应该找到一种新的方法来解决这个问题。 - Dora Herbert
考虑到这是一个方法,我们可以简单地设置一个字段或属性,因此将它们传递可能不是最好的选择。 - dursk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接