Использование наследования как это правильно? - PullRequest
0 голосов
/ 20 января 2020

Я учусь по наследству, изучая Java.

Я создаю программу (Bitcoin Mining Game).

Я создал диаграмму классов о Digger (Mining Machine) ).

В программе

есть обычный копатель (это только копает монеты), оверклокер

(это может копать и может разгоняться, чтобы копать быстрее) и

копатель для восстановления прочности (он может копать, разгонять и восстанавливать прочность (у каждого копателя есть прочность, долговечность падает во время копания).

(Есть некоторые атрибуты и методы, которые я не описал в я думал, что они не нужны для моего вопроса.)

enter image description here

Я не уверен, что все сделал правильно. Я надеюсь получить некоторые Отзыв об Inheritance.

Или вместо использования наследования. Должен ли я просто создать такой класс?

Поскольку к классам добавляется только одна функция.

enter image description here

Спасибо за чтение!

1 Ответ

0 голосов
/ 20 января 2020

Это может быть хорошим кандидатом для шаблона Decorator, который позволяет применять настраиваемые функции к отдельному объекту во время выполнения. Хорошая ссылка на это может быть найдена на странице Decorator Pattern Wikipedia, которая включает в себя подробный пример системы Windowing с диаграммой классов UML для справки. Фрагмент кода показывает декоратор и декоратор бетона:

// abstract decorator class - note that it implements Window
abstract class WindowDecorator implements Window {
    private final Window windowToBeDecorated; // the Window being decorated

    public WindowDecorator (Window windowToBeDecorated) {
        this.windowToBeDecorated = windowToBeDecorated;
    }
    @Override
    public void draw() {
        windowToBeDecorated.draw(); //Delegation
    }
    @Override
    public String getDescription() {
        return windowToBeDecorated.getDescription(); //Delegation
    }
}

// The first concrete decorator which adds vertical scrollbar functionality
class VerticalScrollBarDecorator extends WindowDecorator {
    public VerticalScrollBarDecorator (Window windowToBeDecorated) {
        super(windowToBeDecorated);
    }

    @Override
    public void draw() {
        super.draw();
        drawVerticalScrollBar();
    }

    private void drawVerticalScrollBar() {
        // Draw the vertical scrollbar
    }

    @Override
    public String getDescription() {
        return super.getDescription() + ", including vertical scrollbars";
    }
}

В вашем случае декоратор будет называться DiggerDecorator, а декораторы бетона могут называться OverclockDecorator и RecoverDurabilityDecorator.

Код для создания экземпляра полностью декорированного объекта может выглядеть следующим образом:

Digger decoratedDigger = new OverclockDecorator(new RecoverDurabilityDecorator(new SimpleDigger()));

Как видите, в этом решении все еще используется наследование, но отдельные функции могут быть "смешаны" по мере необходимости.

...