简体   繁体   English

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

[英]instantiating an inner abstract class of another abstract class

I have an abstract class that has another inner abstract class like following: 我有一个抽象类,有另一个内部抽象类,如下所示:

public abstract class TemplateFace {

    public abstract Layout generateFace();

    public abstract class PopulateGridHandler implements ClickHandler {

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

And I have another class which extends this TemplateFace class as the following: 我有另一个类,它扩展了这个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...
        }
    }
}

And Finally I am trying to use the inner PopulateGridHandler class of the AdminFace class (the class that extended the abstract one) inside another class like the following: 最后,我试图在另一个类中使用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 , I am just trying to utilize an abstract class which has another abstract class in it. 总而言之 ,我只是想利用一个抽象类,其中包含另一个抽象类。 However the java compiler thinks that I am trying to instantiate an abstract class. 但是java编译器认为我试图实例化一个抽象类。 How can I workaround the problem? 我该如何解决这个问题?

Thanks for any help, recommendation, comments... 感谢您的帮助,推荐,评论......

The Java compiler only knows about the declared type of your parameter templateFace that is - in this case - TemplateFace . Java编译器只知道参数templateFace的声明类型 - 在本例中是TemplateFace So the expression 所以表达

templateFace.new PopulateGridHandler()

does exactly mean that: Instantiate the abstract class PopulateGridHandler (which isn't allowed). 确实意味着:实例化抽象PopulateGridHandler (不允许)。

Actually it seems that you tried to override an inner abstract class definition in a subclass. 实际上,您似乎试图覆盖子类中的内部抽象类定义。 That won't work. 那不行。 Only methods can be overridden. 只能覆盖方法。 And this is also the way to go: 这也是要走的路:

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

Then declare your subclass as following: 然后声明您的子类如下:

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 ... }
    }
}

And then simply use the method createPopulateGridHandler for creating such a class: 然后只需使用createPopulateGridHandler方法创建这样的类:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM