2017-09-22 8 views
2

はJavaで、このクラス図を持っていると仮定します。私が知りたいのですがどのような関数の引数:抽象クラスまたはインタフェース?

<Interface> <AbstractClass>  <ConcreteClass>  

            Γ SomethingImpl1 
ISomething <- AbstractSomething <--| 
            L SomethingImpl2 

Somethingを取る関数の引数を持っている必要がありますどのようなタイプです。

ICity(など...)とILocationとしてください。 ILocationは、例えば、都市を設定する機能を持っている場合:

void setCity(X city); 

Xは何をすべきですか? ICityまたはAbstractCity?正しい署名は何ですか?

答えて

3

ISomething/ICityは、インターフェイスが提供する機能(通常はそうである)が必要な場合のみ、パラメータの正しいタイプです。 (あなたが行ったように)最低限のことができますインターフェイス、およびJavaでは

    1. コード、interface可能であればことを確認;:一般的に、この方法で、を実装する正当な理由がある場合は、AbstractSomething/AbstractCityを経由してではなく、この方法で使用することができます。

  • +0

    たとえば、「City」を「Storable」にする必要がある場合はどうなりますか?格納可能なオブジェクトは 'IStorable'インタフェースを実装します。しかし、インタフェースは他のインタフェースを実装することはできません。たとえ可能であっても、「継承よりも優先して合成する」ことはできません。どのように対処することができますか?私は 'AbstractCity'に' IStorable'を実装させることができますが、 'ICity'を取る関数はそれについて何も知らないでしょう。 – mydriasis

    +0

    @mydriasis:メソッドが 'ICity'と' IStorable'の両方でなければならない場合、 'interface IStorableCityはICity、IStorable {}'を継承して実装します。 Javaが 'myMethod(ICity + IStorable city)'や何かをすることを許したなら、これが前もって予期されておらず、あなたがアクセスすることができないということを意味するので、これは素晴らしいことです(私の見解では一見すると) 'City'、あなたはそれをすることはできません。しかしそれはしません。 –

    +1

    ありがとう!私の唯一の心配は、クラス/インタフェースの数がすぐにすべての "複合エンティティ"で爆発することですが、私はそれが支払う価格だと思います... – mydriasis

    関連する問題