Интерфейсы с наследованием абстрактных классов - PullRequest
0 голосов
/ 05 мая 2020

Привет, ребята, так что я новичок в Java, и у меня возникли проблемы с освоением интерфейсов, абстрактных классов и c .. Итак, у меня есть проблема, которую я не уверен, что решу. По сути, у меня есть один интерфейс, который предполагается реализовать абстрактным классом, и этот абстрактный класс предполагает "иметь" (не уверен, какой термин правильный) несколько других классов. Теперь я думаю, что сделал первую часть:

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;
}

}

Итак, во-первых, мне нужно было заставить абстрактный класс переопределить методы и использовать геттеры для получения значений, чем мне нужно было расширить абстрактный класс, используя супер конструктор для вызова методы getName et c .. (надеюсь, я сделал это правильно), и теперь в классе товаров у меня есть 2 конструктора, первый (статья статьи) приостановлен, чтобы установить значение количества равным 0, что не имеет смысла для меня, не следует ли это делать во втором конструкторе? Теперь проблема в том, что когда я пытаюсь скомпилировать класс Merchandise, я получаю сообщение об ошибке, в котором говорится, что мне нужно сделать класс абстрактным или переопределить метод getDescription (). Есть ли способ избежать этого?

Спасибо!

1 Ответ

0 голосов
/ 05 мая 2020

Похоже, вы пытаетесь реализовать Шаблон декоратора : Merchandise оба - это 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;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...