好的,所以我可以回答我自己问题的 B) 部分。虽然我真的很感激关于如何提供我自己的实现的整体问题的答案。
所以我的猜测并不完全正确。根据Deferred Binding的这一部分,基本上你必须首先创建一个超类对象,特定于浏览器的对象将继承该对象。例如:
GenericBrowserObject是超类,并且可能在特定于浏览器的对象之间具有某些方法的通用实现,或者可能是所有其他(非特定)浏览器的“包罗万象”实现。
例如,假设您只想为基于 IE 和 Gecko 的浏览器提供特定的实现。
GeckoBrowserObject extends GenericBrowserObject
IEBrowserObject extends GenericBrowserObject
假设调用setStyle了一个通用方法,但它们在和GenericBrowserObject之间有不同的实现,那么您将在每个类中覆盖并提供它们自己的实现。GeckoBrowserObjectIEBrowserObjectsetStyle
操作这些对象的类需要以GenericBrowserObject这种方式实例化超类:
GenericBrowserObject obj = GWT.create(GenericBrowserObject.class);
obj.setStyle("whatever");
然后在您的模块文件(something.gwt.xml)中,您将拥有如下内容:
<replace-with class="com.domain.blah.GenericBrowserObject">
<when-type-is class="com.domain.blah.GenericBrowserObject"/>
</replace-with>
<replace-with class="com.domain.blah.IEBrowserObject">
<when-type-is class="com.domain.blah.GenericBrowserObject"/>
<any>
<when-property-is name="user.agent" value="ie6"/>
<when-property-is name="user.agent" value="ie8"/>
</any>
</replace-with>
<replace-with class="com.domain.blah.GeckoBrowserObject">
<when-type-is class="com.domain.blah.GenericBrowserObject"/>
<any>
<when-property-is name="user.agent" value="gecko"/>
<when-property-is name="user.agent" value="gecko1_8"/>
</any>
</replace-with>
当 GWT 编译它时,它将通过 GWT.create 根据用户代理字符串生成正确的对象。