2017-08-31 10 views
2

相続に関する状況があります。インタフェース/継承を使用しているときに重複しているコード

基本的に私は次のような状況があります。

Structure

Webサービスは、すべてのWebサービスのためのすべての一般的な機能を保持している抽象クラスです。 その後、ほとんどのWebサービスは、プロモーションWebサービス(プロモーションデータの取得)または人物に関する情報の取得(PersonWebservice)に分割されます。これらは抽象的なものです。なぜなら、それらはすべての子どもに当てはまる一般的な実装を保持しているからです(データを取得した後に余分な処理をすると思います)。子は、その子Webサービスに固有の関数と実装のみを保持します。

これまでのところとても良いですが... ...私は1つのwebservice(Webservice E)を持っています。このwebserviceは人のwebserviceとpromo webserviceの両方ですから...実際には、WebサービスとPromo/Person Webサービスの間にスーパークラスを置くことはできません。このWebservice Eが両方を行うことができる間に、ほとんどのWebサービスで機能が制限されているのは事実です。

私はインターフェイスを使用することを考えましたが、子供たちにすべてのジェネリックコードを複数回実装するか、スーパークラスの1つを拡張して、他のブランチの汎用コードの半分を複製する必要があります。私に良いデザインのようには聞こえません...

できるだけ多くの重複コードを避けながら、このようなデザイン/構造の問題を解決するには、どのような良いアプローチをとっていいでしょうか?

事前に感謝します。

+0

何を意味するのですか?あなたはそれらの上に1つを置くことができます – Stultuske

+0

はい申し訳ありませんが、私はそれを意味しています。 WebService - >スーパークラスnew - > Promo/PersonWebserviceのように。しかし、私は、PromoとPerson webserviceの間の「共有」プロパティを確認するのは難しいと感じています。彼らはその1つまたは両方を行う能力を持っていることがより多くです。 –

+0

これはコードの匂いを指しています、https://en.wikipedia.org/wiki/Single_responsibility_principle、なぜWebservice Eに複数の責任があるのですか?それらを分割する方法はありませんか? –

答えて

3

念頭に置く典型的な事柄:FCoI - 継承よりも優先する構成。

あなたは可能性:

  • インターフェイスを作成「コア機能」
  • ラップアラウンドは、これらの既存のクラスには、それに応じて
  • をそれらを実装しているとWebServiceImplは、インタフェース実装する - によってを委任しますインスタンス他のクラス
0

私が見る限り、WebサービスとPromo/Person Webサービスの間にスーパークラスを配置するオプションはありません。このWebservice Eが両方を行うことができる間に、ほとんどのWebサービスで機能が制限されているのは事実です。

なぜでしょうか? WebService EWebServiceを実装するクラスとして配置し、次にPromotional WebservicePerson Webserviceを拡張して抽象としてabstratにする必要があるメソッドをオーバーライドすることができます。

方法を抽象化の簡単な例:あなたは「それらの間のスーパークラスを」

public abstract class Animal { 

    @Override 
    public abstract String toString(); 
} 
関連する問題