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)`
    }
}

最佳答案

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

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

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

07-26 09:27