2
はJavaで、このクラス図を持っていると仮定します。私が知りたいのですがどのような関数の引数:抽象クラスまたはインタフェース?
<Interface> <AbstractClass> <ConcreteClass>
Γ SomethingImpl1
ISomething <- AbstractSomething <--|
L SomethingImpl2
はSomething
を取る関数の引数を持っている必要がありますどのようなタイプです。
ICity
(など...)とILocation
としてください。 ILocation
は、例えば、都市を設定する機能を持っている場合:
void setCity(X city);
をXは何をすべきですか? ICity
またはAbstractCity
?正しい署名は何ですか?
たとえば、「City」を「Storable」にする必要がある場合はどうなりますか?格納可能なオブジェクトは 'IStorable'インタフェースを実装します。しかし、インタフェースは他のインタフェースを実装することはできません。たとえ可能であっても、「継承よりも優先して合成する」ことはできません。どのように対処することができますか?私は 'AbstractCity'に' IStorable'を実装させることができますが、 'ICity'を取る関数はそれについて何も知らないでしょう。 – mydriasis
@mydriasis:メソッドが 'ICity'と' IStorable'の両方でなければならない場合、 'interface IStorableCityはICity、IStorable {}'を継承して実装します。 Javaが 'myMethod(ICity + IStorable city)'や何かをすることを許したなら、これが前もって予期されておらず、あなたがアクセスすることができないということを意味するので、これは素晴らしいことです(私の見解では一見すると) 'City'、あなたはそれをすることはできません。しかしそれはしません。 –
ありがとう!私の唯一の心配は、クラス/インタフェースの数がすぐにすべての "複合エンティティ"で爆発することですが、私はそれが支払う価格だと思います... – mydriasis