具有抽象类继承的接口

时间:2020-05-05 17:43:28

标签: java

大家好,我是Java的新手,我在摆脱接口,抽象类等问题时遇到了一些麻烦。所以在这里,我有这个问题我不确定要解决。基本上,我有一个接口,应该由一个抽象类实现,并且那个抽象类应该“另外”拥有几个其他类(不确定什么是正确的术语)。现在,我认为我做了第一部分:

abstract class AbstractArticle implements Article {
final private String name;
final private double price;
final private String description;

AbstractArticle(String name,double price,String description) {
    this.name = name;
    this.price = price;
    this.description = description;     
}

public String getName() {
    return name;
}

public double getPrice() {
    return price;
}

public String getDescription() {
    return description;
}



class Accessory extends AbstractArticle {
final String instructionsForUse;

Accessory(String name, double price, String description, String instructionsForUse) {
    super(name,price,description);
    this.instructionsForUse = instructionsForUse;
}

public String getinstructionsForUse() {
    return instructionsForUse;
}

class Merchandise implements Article {
final private int quantity;
Article article;

Merchandise(Article article) {
    this.article = article;
    quantity = 0;   
}

Merchandise(Article article, int quantity) {
    this.article = article;
    this.quantity = quantity;
}

public int getQuantity() {
    return quantity;
}

public Article getArticle() {
    return article;
}

}

因此,首先,我需要使抽象类重写方法并使用getter获取值,而不是我需要使用超级构造函数来扩展抽象类以调用方法getName等。(希望我做对了)现在我在类商品中有两个构造函数,第一个(第Article文章)被设置为将value的值设置为0,这对我来说是没有意义的,不是应该在第二个构造函数中完成吗?问题是,当我尝试编译Merchandise类时,出现一条错误消息,提示我需要使该类抽象化或重写方法getDescription()。有什么办法可以避免这种情况?

谢谢!

1 个答案:

答案 0 :(得分:0)

似乎您正在尝试实现Decorator PatternMerchandise Article都有 Article

您的Merchandise类基本上包装了一个现有的Article并向其中添加了一个quantity字段。这个想法是Merchandise是“ Article有数量”。

如果您希望能够将Merchandise实例视为Article,则需要定义在Article接口中声明的方法。大概这里的想法是让那些方法返回包裹的Article实例返回的相同内容,您可以这样做:

class Merchandise implements Article {

    final private int quantity;
    Article article;

    Merchandise(Article article) {
        this.article = article;
        quantity = 0;   
    }

    Merchandise(Article article, int quantity) {
        this.article = article;
        this.quantity = quantity;
    }

    public int getQuantity() {
        return quantity;
    }

    @Override
    public String getDescription() {
        return article.getDescription();
    }

    // and similarly for any other methods declared in Article

    // you might not really want (or need) this:
    public Article getArticle() {
        return article;
    }

}