次の問題があります。たとえばUserExpactations
というインターフェイスがあり、いくつかのロジックを確認するためにbuilder-style
に多数のメソッドがあります。インターフェイスから一般的なメソッドを抽出します。
はこのようになります:あなたは、各メソッドがUserExpactations
を返すことができたよう
interface UserExpectations {
UserExpectations expectSuccessResponseFromApi;
UserExpectations expectFailResponseFromApi;
UserExpectations expectUserInDB;
// more user-specific methods
}
ので、我々はそれらを一緒に連鎖することができます。
もう1つのexpectatorクラスを追加する必要があります。いくつかの共通ロジック、つまり最初の2つのメソッドがあります。
だから、このように見えるようになるだろう:
interface OrderExpectations {
// these are common to UserExpectations
OrderExpectations expectSuccessResponseFromApi;
OrderExpectations expectFailResponseFromApi;
OrderExpectations expectOrderInCart;
OrderExpectations expectOrderInDB;
// some more order specific methods
}
を私は抽象クラスまたは多分別のトップレベルインターフェースにこれらの一般的な方法を抽出したいです。そして、これらの方法は1つの場所に実装する必要があります。そして、それぞれのexpectators
は、その実装を認識している必要があります。しかし問題は、メソッドを連鎖させる能力を維持するために、それぞれの共通メソッドが特定の*Expactations
型を返さなければならないことです。
これを実装する方法が見つかりません。たぶん、私が気付いていないこの問題を容易にするのに役立つ良いパターンがあります。 アイデア
更新日:
このよう:
abstract class CommonExpactations<T> {
T expectSuccessResponseFromApi() {
// do some logic and then return T
}
T expectFailResponseFromApi() {
// do some logic and return T
}
}
ではなく、それぞれの実装*期待の特定のインターフェイスがすべき
は、だから私は、一般的な方法が含まれます抽象Expecationsを作成したいです共通メソッドへのアクセスを得るためにCommonExpactationsを拡張します。 しかし、javaでは抽象クラスでT
タイプの新しいオブジェクトを作成することはできません。具体的な実装では他のメソッドを連鎖させるためです。ですから、例えば
、
UserExpectationsImpl implements UserExpectations extends CommonExpactations<UserExpectations>
ジェネリック経由でないと言う、そして持っている '保護抽象TのnewInstance();'それはサブクラスによって実現されます。 –
あなたの "更新"のための[mcve]を投稿するべきです(2番目のメソッドの返り値の型に 'T UserExpectations expectFailResponseFromApi'があることにも注意してください)。 –