实例化另一个抽象类的内部抽象类

时间:2014-07-14 08:17:52

标签: java interface polymorphism abstract-class inner-classes

我有一个抽象类,它有另一个内部抽象类,如下所示:

public abstract class TemplateFace {

    public abstract Layout generateFace();

    public abstract class PopulateGridHandler implements ClickHandler {

        @Override
        public abstract void onClick(ClickEvent event);
    }
}

我还有另一个类,它扩展了 TemplateFace 类,如下所示:

public class AdminFace extends TemplateFace {
    private ListGrid adminListGrid;

    public Layout generateFace() {
        adminListGrid = GridBuilder.buildFullGrid(this);
    }

    public class PopulateGridHandler implements ClickHandler {

        @Override
        public void onClick(ClickEvent event) {
            // some implementations...
        }
    }
}

最后,我试图在另一个类中使用AdminFace类的内部PopulateGridHandler类(扩展抽象类的类),如下所示:

public class GridBuilder {

    // Here i get the argument as abstract class
    public static ListGrid buildFullGrid(TemplateFace templateFace)
    {
        ToolStripButton addRowButton = new ToolStripButton();
        addRowButton.setPrompt("Add new record");

        // I get the error here saying: Cannot instantiate the type 
        // TemplateFace.PopulateGridHandler
        addRowButton.addClickHandler(  templateFace.new PopulateGridHandler() );
    }
}

ALL IN ALL ,我只是想利用一个抽象类,其中包含另一个抽象类。但是java编译器认为我试图实例化一个抽象类。我该如何解决这个问题?

感谢您的帮助,推荐,评论......

1 个答案:

答案 0 :(得分:3)

Java编译器只知道参数templateFace的声明类型 - 在本例中为TemplateFace。所以表达式

templateFace.new PopulateGridHandler()

确实意味着:实例化 abstract PopulateGridHandler(不允许)。

实际上,您似乎试图在子类中覆盖内部抽象类定义。那不行。只能覆盖方法。这也是要走的路:

public abstract class TemplateFace {
    public abstract Layout generateFace();
    public abstract PopulateGridHandler createPopulateGridHandler();
    protected abstract class PopulateGridHandler implements ClickHandler{
        @Override
        public abstract void onClick(ClickEvent event); 
    }
}

然后将您的子类声明如下:

public class AdminFace extends TemplateFace{
    private ListGrid adminListGrid;
    public Layout generateFace() {
        adminListGrid = GridBuilder.buildFullGrid(this);       
    }
    public PopulateGridHandler createPopulateGridHandler() {
        return new MyPopulateGridHandler();
    }
    private class MyPopulateGridHandler extends PopulateGridHandler {
        @Override
        public void onClick(ClickEvent event) { // some implementations ... }
    }
}

然后只需使用方法createPopulateGridHandler来创建这样的类:

public static ListGrid buildFullGrid(TemplateFace templateFace) {
    ToolStripButton addRowButton = new ToolStripButton();
    addRowButton.setPrompt("Add new record");
    addRowButton.addClickHandler(templateFace.createPopulateGridHandler());
}