Java UiBinder:是否可以重写UiFactory方法?
在提出问题之前,我将简要描述一下上下文。 我有一个Widget类,它将ui实现“外包”给一个单独的类(如下所示): 实际的小部件类可以使用Ui类实例获取对特定子字段小部件/元素的引用:Java UiBinder:是否可以重写UiFactory方法?,java,gwt,uibinder,Java,Gwt,Uibinder,在提出问题之前,我将简要描述一下上下文。 我有一个Widget类,它将ui实现“外包”给一个单独的类(如下所示): 实际的小部件类可以使用Ui类实例获取对特定子字段小部件/元素的引用: Ui ui; public SimpleFilmWidget() { this(new DefaultUi()); } public SimpleFilmWidget(Ui customUi) { assert customUi != null
Ui ui;
public SimpleFilmWidget() {
this(new DefaultUi());
}
public SimpleFilmWidget(Ui customUi) {
assert customUi != null : "UI should not be null!!!";
ui = customUi;
initWidget(ui.getMainPanel());
}
我使用UiBinder提供了实际的UI实现,它使用UiFactory创建另一个复杂的子小部件
class DefaultUi implements Ui {
//...
@UiFactory
protected VoteWidget createVoteWidget(){
return new VoteWidget(msg){
@Override
protected SetVoteEvent onSetVote(Star star, boolean fireEvents) {
return clientWidget.onSetVote(super.onSetVote(star, fireEvents));
}
};
}
问题是:
当我提供DefaultUi的子类时,UiFactory方法能否在不混淆UiBinder解析器的子类中被重写
编辑:
UiFactory方法不应被重写,因为uibinder同时看到这两种方法(被重写和被重写),并与同一类型的两个UiFactory混淆:
[错误]VoteWidget类型的SimpleFilmWidget.DefaultUi类中存在重复工厂,我看不出有什么理由不可能:UiBinder查看公开的API,并调用传递给createAndBindUi
的实际实例上的方法,这只是标准多态性 我看没有理由不可能:UiBinder查看公开的API,并在传递给createAndBindUi
的实际实例上调用该方法,这只是标准的多态性 结论:
UiFactory方法不应被重写,因为uibinder同时看到这两种方法(被重写和被重写),并与同一类型的两个UiFactory混淆:[ERROR]类SimpleFilmWidget.DefaultUi中重复工厂,用于VoteWidget类型。
从对@Thomas Broyer的评论:
我怀疑,它然后调用超类的UiFactory注释方法,这不是我想要它做的。我离开了这个问题,因为在这种情况下,变通的态度对我来说已经足够了
谢谢你的关心 结论:
UiFactory方法不应被重写,因为uibinder同时看到这两种方法(被重写和被重写),并与同一类型的两个UiFactory混淆:[ERROR]类SimpleFilmWidget.DefaultUi中重复工厂,用于VoteWidget类型。
从对@Thomas Broyer的评论:
我怀疑,它然后调用超类的UiFactory注释方法,这不是我想要它做的。我离开了这个问题,因为在这种情况下,变通的态度对我来说已经足够了
谢谢你的关心 谢谢你的回答。我无法立即检查它是否有效,因为我进行了更大的重构,而项目目前还没有构建,所以我想确保我的重构是否正确。我今天会检查它是否有效。你能展示一下你试过的代码吗?(是的,生成器确实有可能不去复制重写的方法;但我读了你的问题,我觉得你不会面对这个问题)我只提到了第二个Ui类扩展了DefaultUi,没有附加一行代码。因此,有一个OldUi类扩展了DefaultUi-OldUi.createVoteWidget()覆盖DefaultUi.createVoteWidget(),因此ubinder为同一类型找到了两个uifactory方法(被覆盖的方法对uibinder仍然可见-我认为是反射api,但没有检查uibinder的源代码),这显然是一个错误。不幸的是,我不被允许为该项目发布有意义的部分源代码。但是UiBinder
接口是使用OldUi
声明的,而不是DefaultUi
,对吗?因此,它不仅仅是调用createAndBindUi
,使用一个子类的实例覆盖@UiFactory
方法,该方法由UiBinder
接口声明中使用的类定义(这里我不清楚)。在这种情况下,是的,似乎发电机中有一个bug。作为一种变通方法,您可以将@UiFactory
设置为final
,并将其委托给另一个可以重写的方法。那么,您可以吗?您是对的,OldUi类重写UiBinder模板接口和工厂方法,createAndBindUi在OldUi构造函数中被调用,以获得正确的UiBinder实例。但是,该项目没有使用最新的gwt版本。谢谢您的回答。我无法立即检查它是否有效,因为我进行了更大的重构,而项目目前还没有构建,所以我想确保我的重构是否正确。我今天会检查它是否有效。你能展示一下你试过的代码吗?(是的,生成器确实有可能不去复制重写的方法;但我读了你的问题,我觉得你不会面对这个问题)我只提到了第二个Ui类扩展了DefaultUi,没有附加一行代码。因此,有一个OldUi类扩展了DefaultUi-OldUi.createVoteWidget()覆盖DefaultUi.createVoteWidget(),因此ubinder为同一类型找到了两个uifactory方法(被覆盖的方法对uibinder仍然可见-我认为是反射api,但没有检查uibinder的源代码),这显然是一个错误。不幸的是,我不被允许为该项目发布有意义的部分源代码。但是UiBinder
接口是使用OldUi
声明的,而不是DefaultUi
,对吗?因此,它不仅仅是调用createAndBindUi
,使用一个子类的实例覆盖@UiFactory
方法,该方法由UiBinder
接口声明中使用的类定义(这里我不清楚)。在这种情况下,是的,似乎发电机中有一个bug。作为一种变通方法,您可以将@UiFactory
设置为final
,并将其委托给另一个可以重写的方法。那么,您可以吗?您是对的,OldUi类重写UiBinder模板接口和工厂方法,createAndBindUi在OldUi构造函数中被调用,以获得正确的UiBinder实例。但是,该项目不使用最新的gwt版本。
class DefaultUi implements Ui {
//...
@UiFactory
protected VoteWidget createVoteWidget(){
return new VoteWidget(msg){
@Override
protected SetVoteEvent onSetVote(Star star, boolean fireEvents) {
return clientWidget.onSetVote(super.onSetVote(star, fireEvents));
}
};
}