Java Composite模式:为什么不能向自身添加组?

时间:2020-01-26 13:42:39

标签: java composite

Group实现了Figure接口,此外还声明了一个公共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 :(得分:0)

正在发生的事情是您在实例化Figure实例时定义了Group类型。

您的Figure接口定义了draw方法,但没有addFigure方法。该方法在Figure接口的实现中定义。

通过接口创建实例时,即使实际实例属于实现类型,您也必须绑定到该接口中定义的方法。结果,您需要将实例强制转换为Group,它将可以正常工作。

答案 1 :(得分:0)

您的变量g1是静态类型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(请考虑向下转换),但不能反过来使用({转换})