我使用GWT和Place&活动机制。
Place是一个类真的很难过,因为我的自定义位置不能扩展另一个类。
当我查看Place代码时,我看到以下内容:
public abstract class Place {
/**
* The null place.
*/
public static final Place NOWHERE = new Place() {
};
}
看到这个,Place可以是一个界面。有没有一个很好的理由让GWT团队选择将Place放置为抽象类而不是接口?
并概括:是否有充分的理由创建真正空的抽象类vs接口?
答案 0 :(得分:7)
一般来说,我不会定义一个空的抽象类
然而,当我希望将来有些成员时,我可能决定使用抽象类而不是接口
“class”表示:这是一个
“界面”表示:此支持
对于“地方”我真的可以看到两个对课程
有一点直观偏好答案 1 :(得分:5)
GWT团队是否有理由选择使用抽象类而不是接口?
我想不到一个。但要说实话,在SO上抱怨它并不会有任何成就。
并概括:是否有充分的理由创建真正空的抽象类vs接口?
假设您可以这样做,以确保有一个共同的基类用于未来预期的要求......或出于其他原因。
但总的来说这是一个坏主意...... IMO。
(当然,出于历史原因,这类事情经常发生;例如,abstract
类过去可能有更多成员被删除。)
答案 2 :(得分:2)
我无法真正告诉Place
(虽然我有一些想法,请参见下文),但我们讨论的是Activity
:https://groups.google.com/d/topic/google-web-toolkit-contributors/V8rhZHiXFRk/discussion
就历史而言,Place
在GWT中有always been一个抽象类(而FWIW,NOWHERE
地方已添加long after;请注意这一点提交引用Wave -soon从互联网上消失 - 我们可以看到interface Place
所以它在设计API的某个时间点是一个接口。)
鉴于PlaceHistoryGenerator
(在你GWT.create()
PlaceHistoryMapper
时使用)查看地方层次结构,有一个抽象类会减少很多边缘情况!
想象一下,您的PlaceHistoryMapper
引用PlaceTokenizers<Foo>
和PlaceTokenizer<Bar>
并且您有一个class FooBar implements Foo, Bar { }
,应该使用哪个令牌系统?如果您未在FooBar
中明确引用PlaceHistoryMapper
课程,则生成器无法看到它(或者更确切地说不会看到它),那么代码应该生成?请记住,我们都需要确定性,因此生成的代码应该始终相同。使用类,生成器可以通过它们的继承树(从最特定的派生到最不具体)对它们进行排序,并且可以安全地假设其中没有特定继承关系的2个地方是完全不同的,所以它们可以是按任意顺序检查(生成的代码中的instanceof
),仍然提供稳定的结果⇒确定性。
免责声明:我是reported订购问题的人,然后provided the patch,但Place
已经是一个类。
答案 3 :(得分:0)
我不能代表GWT团队,但这个抽象类似乎唯一的原因是强制定义NOWHERE。
正如您所发现的那样,以这种方式使用抽象类会强制您进入可能不适合您的业务模型的类层次结构。 因此,一般来说,如果抽象类真的完全是空的,那就完全没有用了。
这个例子特别奇怪,因为接口是契约。 GWT Place
没有接口,因此没有合同。他们的javadoc说:
“代表应用中的可收藏位置”
我本来期望定义一些合同来处理这种情况。可收藏的位置需要哪些方法?如果这只是一个标记,如Serializable
,我肯定会期望它是一个接口而不是一个抽象类。