6

私はGWTとPlace&Activityメカニズムを使用しています。

私のカスタムプレイスは別のクラスを拡張できないため、プレイスがクラスであるのは本当に悲しいことです。

プレイスコードを見ると、次のように見えます。

public abstract class Place {

  /**
   * The null place.
   */
  public static final Place NOWHERE = new Place() {
  };

}

それを見て、プレイスはインターフェースになることができます。GWTチームがPlaceをインターフェースではなく抽象クラスにすることを選択した正当な理由はありますか?

そして一般化するために:本当に空の抽象クラス対インターフェースを作成する正当な理由はありますか?

4

4 に答える 4

7

一般的に、私は空の抽象クラスを定義しません

ただし、将来的に一部のメンバーを期待する場合は、インターフェイスの代わりに抽象クラスを使用することを決定する可能性があります

「クラス」とは、これがAであることを意味します。

「インターフェース」とは、このサポートを意味します。

「場所」については、クラスの直感的な好みで両方を実際に見ることができました

于 2012-04-12T12:03:22.580 に答える
5

GWTチームがPlaceをインターフェースではなく抽象クラスにすることを選択した正当な理由はありますか?

思いつかない。しかし、現実的には、SOでそれについて不平を言うことは何も達成するつもりはありません。

そして一般化するために:本当に空の抽象クラス対インターフェースを作成する正当な理由はありますか?

仮に、これを行うと、将来予想される要件のために、またはその他の理由で、単一の共通基本クラスが確実に存在するようになります。

しかし、一般的に言えば、それは悪い考えです...IMO。

(もちろん、このようなことは歴史的な理由でよく起こります。たとえば、abstractクラスには過去に削除されたメンバーが多かった可能性があります。)

于 2012-04-12T12:07:06.387 に答える
2

私は本当にわかりませんPlace(私はいくつかのアイデアを持っていますが、以下を参照してください)が、それはActivityhttps ://groups.google.com/d/topic/google-web-toolkit-contributors/V8rhZHiXFRkのために議論されました/討論

Place私たちが歴史に残る限り、常にGWTの抽象クラスでした(そしてFWIW、そのNOWHERE場所はずっと後に追加されました;このコミットはWaveを参照していることに注意してください-すぐにインターネットから消えます-私たちが見ることができるinterface PlaceのでAPIを設計している間のある時点でのインターフェース)。

PlaceHistoryGenerator(あなたがGWT.create()PlaceHistoryMapperが場所の階層を見るとすると、抽象クラスを持つことで多くのエッジケースが削減されます!参照を想像
してみてください。そして、どのトークナイザーを使用する必要がありますか?クラスを明示的に参照しない場合PlaceHistoryMapperPlaceTokenizers<Foo>PlaceTokenizer<Bar>class FooBar implements Foo, Bar { }FooBarPlaceHistoryMapper、ジェネレーターはそれを認識しません(またはむしろそれを認識しません)ので、どの種類のコードを生成する必要がありますか?また、決定論が必要なため、生成されるコードは常に同じである必要があることに注意してください。クラスを使用すると、ジェネレータはそれらを継承ツリー(最も具体的な-最も派生したものから最も具体的でないものまで)で並べ替えることができ、クラスに特定の継承関係がない2つの場所が完全に異なると安全に想定できるため、次のようになります。 (生成されたコードで)任意の順序でチェックinstanceofされ、それでも安定した結果を提供します⇒決定論。

免責事項:私は注文の問題を報告してからパッチを提供した人ですが、Placeすでにクラスでした。

于 2012-04-12T16:36:49.553 に答える
0

GWTチームについて話すことはできませんが、この抽象クラスにあると思われる唯一の理由は、NOWHEREの定義を強制することです。

ご存知のように、このように抽象クラスを使用すると、ビジネスモデルに適さない可能性のあるクラス階層に強制されます。したがって、一般に、抽象クラスが本当に完全に空である場合、目的はまったくありません。

ただし、インターフェイスはコントラクトであるため、この例は特に奇妙です。GWTPlaceにはインターフェースがないため、コントラクトはありません。彼らのjavadocは次のように述べています。

「アプリ内のブックマーク可能な場所を表します」

このシナリオに対処するために定義された契約を期待していました。ブックマーク可能な場所にはどのような方法が必要ですか?これがのような単なるマーカーであるSerializable場合、抽象クラスではなくインターフェイスであると確信しています。

于 2012-04-12T12:25:15.560 に答える