3

多くの保護されたメソッドを定義する基本クラスを作成しました。これらのメソッドは、そのサブクラスで呼び出されます。メソッドは、そのサブクラスの基本的な操作を定義します。例えば:

class Base{
   protected void foo(){}
   protected void bar(){}
}

class Sub1 extends Base{//The sub class only needs Base.foo()
   public void po(){
     ...
     foo();
     ...
   }
}

class Sub2 extends Base{//The sub class only needs Base.bar()
   public void ko(){
     ...
     bar();
     ...
   }
}

class Sub3 extends Base{//The sub class needs both Base.bar() and Base.foo()
   public void lo(){
     ...
     bar();
     ...
     foo();
   }
}

私はそれが良いOOPデザインであるかどうか疑問に思っていますか?ソースを読んでください、私たちはまったく必要ないことを知っSub1ていますBase.bar()、まったくSub2必要ありませんBase.foo()。ちょっと冗長だと思います。しかし、私はより良い解決策を知りません、誰かがいくつかのアドバイスを与えることができますか?ありがとう!

4

4 に答える 4

3

一般に、設計ではこの種のオブジェクトの依存関係を回避する必要があります。foo()とbar()の機能が派生クラスで変更されない場合は、それを外部クラスに入れて、代わりにそれを使用することをお勧めします。

class Base{

}

class Helper1  {
   public void foo(){}
}

class Helper2  {
   public void bar(){}
}

class Sub1 extends Base{
   private Helper1 a = new Helper1();
   private Helper2 b = new Helper2();

   public void po(){
     ...
     a.foo();
     ...
     b.bar();
   }
}

class Sub2 extends Base{
   private Helper2 b = new Helper2();

   public void ko(){
     ...
     b.bar();
     ...
   }
}

このfoo&barの例はよく見えません。あなたの問題は、オブジェクトへの責任の不適切な割り当てまたは継承の誤用である可能性があります。実際のコードを投稿すると、より良い答えを書くのに役立ちます。

于 2010-08-22T13:46:03.637 に答える
2

申し訳ありませんが、あなたはこれについて間違った方法で考えています。問題は、「sub2はベースを継承する必要がある、そのメソッドは必要ない」ではありません。

質問は「sub2はベースですか」である必要があります。たとえば、カエル​​は動物ですか?はい、カエルは動物を継承できますが、カエルは哺乳類を継承するべきではありません。

sub2ベースである場合、あなたは正しい方向に進んでいます。ベースが有用である可能性のある関数の単なるコレクションである場合、何かが間違っています。

于 2010-08-22T13:52:11.797 に答える
1

私の考え

1-初めて設計する場合は、依存性注入の原則に従うようにしてください。異なるサブクラスでオブジェクトHelper1、Helper2を作成しており、コードも複製している可能性があることがはっきりとわかります。

2-ヘルパー1とヘルパー2の異なるインスタンスが必要ない場合は、基本クラスのプロパティとしてHelper1とHelper 2を作成するか、必要に応じて上書きできるように仮想化することをお勧めします。

3-実装に直接書き込んでいて、クライアントコードは、インターフェイスを使用する具体的なクラスに直接依存しているため、クラスのテストが容易になります。

4-そしてここに黄金律があります:あなたが扱っている問題がそれほど複雑ではなく、あなたがしていることを使い続けるよりも近い将来それらを変える理由が見当たらない場合は、あなたの人生を複雑にしないでください。

すべての優れたオブジェクト指向プログラミングは優れていますが、ABSTRACTIONを使用するためのより単純な1つのベコズを実装するよりも優れた単純なソリューションを見つけた場合は、複雑さの代償を払うことになります。

もう1つの重要なルール: 設計が正しい軌道に乗っているよりも、設計を変更せずにクラスの設計を簡単にテストできるかどうかを確認します。

于 2010-08-22T14:40:47.593 に答える
1

これは、インターフェイス分離の原則がSOLIDルールの1つであることがわかり ます。

サブクラスがすべての基本クラス関数を必要としない場合は、基本クラスをより具体的な基本クラスまたはインターフェイスに分割できます。

于 2010-08-23T09:55:52.440 に答える