[英]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.