2016-10-25 7 views
0

基本的な操作を行う抽象クラスがありますが、今度はすべての派生クラスにメソッド「check」を強制したいのですが、このメソッドについては何も分かりません。例えば、抽象クラス:クラスを実装するJava、パラメータを知らないメソッドの強制実装

public abstract class Service<T extends Transport> { 

    public T getTransport(int id) { 
    [...] 
    } 

    public abstract boolean checkTransport(T transport, ...); 

} 

と2:

public ServiceAAA extends Service<ClassA> { 

    public boolean checkTransport(ClassA t) { 
    [...] 
    } 

} 

public ServiceBBB extends Service<ClassB> { 

    public boolean checkTransport(ClassB t, Integer value, Integer otherValue) { 
    [...] 
    } 

} 

ServiceBBBは、クラスのClassBのオブジェクトtをチェックするために、2つのパラメータを必要とします。 もちろん、それは動作しません、サブクラスが "Object ..."表記を使わずにcheckTransportメソッドを実装するように強制する方法はありますか?

+0

いいえ、varargsを使用すると、悪い設計をハッキングして作業する(または少なくともコンパイルする)ことになります。 – Kayaman

+0

あなたはこれをしたいと思っていますか? –

+0

私は実装者にcheckTransportメソッドを書き込ませたいと思っています。もちろん、私のアプローチには欠陥があります。 –

答えて

1

いいえ、ありません。

となりました。このメソッドは、抽象Serviceクラスから、またはService<...>という型でこのオブジェクトへの参照を持つ呼び出しサイトから呼び出す方法はありますか?特定のサブクラスのメソッドが予期していることを知る方法がないため、メソッドを呼び出す方法がありません。

これを回避する方法の1つは、CheckerをクラスとしてServiceに渡すことです。つまり、継承の代わりに合成を使用することです。これを行うと、チェッカーのインターフェースに余分な引数を全く持たせることができます(例えば、Predicateが機能するかもしれません)。そのチェッカーを実装する特定のサブクラスは、構築時に引数を渡すことができます。

関連する問題