java继承和字符串插值

wa7juj8i  于 2021-06-27  发布在  Java
关注(0)|答案(2)|浏览(373)

我正在学习java中的oop,并尝试决定是否可以/应该在本例中使用继承。不要注意访问修饰符之类的东西。
有两种宠物:
狗(名称、品种、年龄、主人)
猫(名称、品种、颜色、主人)
dog.tostring()应该返回 "Name: name, Breed: breed, Age: age, Owner: owner" cat.tostring()应返回 "Name: name, Breed: breed, Color: color, Owner: owner" 我的问题是:我应该在抽象类中实现tostring(),在派生类中重写吗?怎样?我是说,只有一个领域。我看不出有什么好处。
所以,我做到了:

abstract class Pet {

    String name;
    String breed;
    String owner;

    // getters setters

    public String toString() { 

         return ????
    } 

}

class Dog extends Pet {

    int age; 

    public String toString() {

       return String.format("Name: %s, Breed:  %s, Age: %d, Owner: %s", name, breed, age, owner)

    }

}

class Cat extends Pet {

    String color; 

    public String toString() {

        return String.format("Name: %s, Breed:  %s, Color: %s, Owner: %s", name, breed, color, owner)

    }

}
yeotifhr

yeotifhr1#

在这种情况下,您可以考虑应用模板方法设计模式。在这个模式中,您在抽象类中定义方法的可重用部分,并且只实现子类中的变量部分。例如:

abstract class Pet {

// ...

    protected abstract String extra(); // Or, return the empty String

    public final String toString() { 
        return String.format("Name: %s, Breed:  %s, %s, Owner: %s", 
            name, breed, extra(), owner);
    } 
}

在您的子类中:

class Dog extends Pet {

    int age; 

    public String extra() {
        return String.format("Age: %d");
    }
}
qcuzuvrc

qcuzuvrc2#

我不会在抽象类中编写tostring()。它在重用代码方面增加的很少,并且使语句更难阅读。将super.tostring()放在语句中间会让人困惑。

相关问题