【问题标题】:inheritance getter from superclass and subclass从超类和子类继承getter
【发布时间】:2018-11-30 00:25:10
【问题描述】:

这是我班级的特色:

我必须重写 toString 方法才能打印出每个类:

“[Superclass]: [name-of-superclass] ---[subclass]: [name-of-subclass]”

每个班级的名称都有 getter getDescription

我知道子类,他们只需要做 super.getDescription 和 this.getDescription。

  1. 但我不明白对于超类 LivingRoomItem,它如何从其子类中调用所有 getDescription?

编辑:

class livingRoomItem{
    int id;
    double price;
    String color;
    String description = "livingRoomItem";

    livingRoomItem(int id, double price, String color, String description){
        this.id = id;
        this.price = price;
        this.color = color;
        this.description = description;
    }

    @Override
    public String toString(){
        return "[Superclass] :" + this.description + "----" + "[subclass]: ";
    }


 public String getDescription() {
    return "livingRoomItem";
}

public void setDescription(String description) {
    this.description = description;
}


class Sofa extends livingRoomItem{
private int seater;

Sofa(int id, double price, String color, String description, int seater){
    super(id, price, color, description);
    this.seater = seater;
}
@Override
public String getDescription(){
    return "Sofa";
}

public int getSeater() {
    return seater;
}

public void setSeater(int seater) {
    this.seater = seater;
}
 @Override
public String toString(){
    return "[Superclass] :" + super.getDescription() + "----" + "[subclass]: "+ this.getDescription() ;
}

}

【问题讨论】:

  • 什么是list.size() <= i?通常是for (int i = 0; i < list.size(); ++i)
  • @KevinO 哦!对不起,我纠正它。但是控制台仍然没有输出我的 totalPrice
  • 不要用double 做数学运算,否则你会得到精度损失和意想不到的结果。而是使用java.math.BigDecimal
  • @LudovicRonsin 好的!下次我编码时,我会注意到这一点。但是为什么我的控制台没有在我的方法上输出任何东西呢?

标签: java inheritance arraylist getter


【解决方案1】:

你的思路是对的,也许只是你的执行不对。

考虑以下类:

public class LivingRoomItem
public class Sofa extends LivingRoomItem
public class Table extends LivingRoomItem
public class Lighting extends LivingRoomItem

您可以处理所有这些LivingRoomItem

在您的calculatePrice 方法中,您将按预期使用LivingRoomItem 来处理所有对象:

public static BigDecimal calculateTotalPrice(List<LivingRoomItem> items) {
    return items.stream().map(item -> item.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
}

由于您将所有对象实例化为它们本身(而不是 LivingRoomItem),并设置价格,它应该可以正常工作:

public static void main(String[] args) {

    Sofa sofa = new Sofa();
    sofa.setPrice(BigDecimal.valueOf(200L));

    Lighting lighting = new Lighting();
    lighting.setPrice(BigDecimal.valueOf(652L));

    Table table = new Table();
    table.setPrice(BigDecimal.valueOf(598L));

    System.out.println(PriceUtil.calculateTotalPrice(Arrays.asList(sofa, lighting, table)));
}

结果:


我在你的toString 中得到了你的观点,为了你的练习,你可以在你的超类toString 中使用instanceof 运算符:

示例(在您的 LivingRoomItem 类中):

return (this instanceof Sofa ? "Superclass... Subclass: Sofa" : "Regular LivingRoomItem toString");

但就像我说的,我认为将Object 显示为超类是正确的:) 并且只在子类上显示LivingRoomItem

希望能帮到你!

【讨论】:

  • 谢谢!!你能告诉我如何覆盖 livingRoomItem 中的 toString 方法,使其返回“[Superclass]: [name-of-superclass] ---[subclass]: [name-of-subclass]”? (我的第一个问题在上面)
  • 尝试覆盖每个子类的toString方法,调用getSuperClass()和getClass()。你可以在这里找到一个例子:stackoverflow.com/questions/9790210/…
  • 是的,我已经覆盖了所有的子类,它们都可以工作。但我被困在超类 livingRoomItem toString 方法中。如何调用它的所有子类的 getDescription 方法?因为当我在我的超类上使用 getClass().getSuperclass() 时,输出的是 java.lang.Object 类,而不是 Sofa、Table、Lighting
  • 您介意编辑问题并为所有这些类添加您当前的 toString 方法吗?只是出于好奇,既然您已经在使用子类,为什么还要让您的超类看到您的子类?
  • 我已经编辑过了。由于大多数子类都是相似的,我只发布了我的超类 livingRoomItem 和子类 Sofa。嗯...因为这是我在java类中的练习题...我们必须熟悉如何使用继承和覆盖方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多