Java Составной шаблон: Почему я не могу добавить группу к себе? - PullRequest
1 голос
/ 26 января 2020

A Group реализует интерфейс Figure и, кроме того, объявляет метод publi c addFigure. Почему я не могу вызвать метод addFigure для моего g1 группового объекта?

public interface Figure  {
    void draw();
}
public class Group implements Figure {
    private List<Figure> figures;

    public Group(Figure... figures) {
        this.figures = new ArrayList<>();
        for (Figure f : figures) {
            this.figures.add(f);
        }
    }

    public void addFigure(Figure f) {
        this.figures.add(f);
    }

    @Override
    public void draw() {
        for (Figure f : figures) {
            f.draw();
        }
    }
}
public class Main {
    public static void main(String[] args) {
        Figure r1 = new Rectangle();
        Figure r2 = new Rectangle();
        Figure r3 = new Rectangle();

        Figure g1 = new Group(r1, r2);
        Figure g2 = new Group(r2, r3);

        g1. // <- only `draw()` availabe, no `addFigure(Figure)`
    }
}

Ответы [ 2 ]

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

Ваша переменная g1 имеет статус c тип Figure. Компилятор не может знать, какая реализация интерфейса используется. При определении переменной используйте тип, который вам нужен, например Group g1 = new Group(...). Тогда вы сможете звонить addFigure в своем экземпляре:

Figure r1 = new Rectangle();
Figure r2 = new Rectangle();
Figure r3 = new Rectangle();

Group g1 = new Group(r1, r2);
Group g2 = new Group(r2, r3);

g1.addFigure(r3);

. Вы можете использовать Group в любом месте, где вы бы использовали Figure (подумайте о снижении рейтинга), но не наоборот. (приведение к базовому типу)

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

Что происходит, вы определяете тип Figure при создании экземпляра Group.

Ваш интерфейс Figure определяет метод draw, но не метод addFigure. Этот метод определен в реализации интерфейса Figure.

Когда вы создаете экземпляр с помощью интерфейса, вы привязаны к методам, определенным в этом интерфейсе, даже если фактический экземпляр имеет реализацию Тип. В результате вам нужно привести экземпляр к Group, и он будет работать.

...