2017-04-19 18 views
0

私は基底クラスを持っています。BaseClassここにあります。そして、派生クラスは2つ、例えばClassAClassBです。また、抽象メソッドFoo()BaseClassで定義されています。両方の派生クラスはFoo()の実装を提供する必要があります。派生クラスのインターフェイスを実装するか、ベースメソッドをオーバーライドします

ClassAFoo()の実際の実装はのはBar()を言わせて、新しい機能が必要ですが、そのような要求をClassBありません。以下のコードサンプルを参照してください。

public abstract class BaseClass 
{ 
    public abstract void Foo(); 
} 

public class ClassA : BaseClass 
{ 
    public override void Foo() 
    { 
     // some implemented code... 
     // and additional method required 
     Bar(); 
    } 
} 

public class ClassB : BaseClass 
{ 
    public override void Foo() 
    { 
     // some implemented code... 
    } 
} 

はその後、私の質問があり来る - 私はIBarインターフェースを実装するか、私は基本法としてBar()方法を確認する必要がありClassAせてください?

私は両方のアプローチが長所と短所を持つことがわかります。

IBarを実装すると、ClassBと比較して付加的な機能があることがわかります。しかし、それはClassAが可能であれば回避しようとする公衆にBar()メソッドを公開することを意味します。

基本メソッドとしてBar()を使用すると、現在は集中化されており、派生クラスでその実装をオーバーライドできるようになります。しかし、我々の場合、ClassBBar()の知識も持っています。

Now:これらのアプローチの1つを好む明確な技術的な理由はありますか? 「より良い」オプションを決定することは可能ですか?

+0

通常の方法のように、BarをクラスAに入れるだけです。 –

+0

@ M.kazemAkhgaryコメントをいただきありがとうございます。しかし、将来、新しい派生クラス 'ClassC'が必要で、' Bar() 'の正確な関数が必要な場合はどうでしょうか? – woodykiddy

+0

Bar()を使用する必要があるクラスはいくつですか?それらは同じ使用法の下にありますか? Bar()の使用法が同じ場合、それを汎用メソッドとしてBaseクラスに入れないのはなぜですか? – User2012384

答えて

3

これは、その後、私の目には「あまりにも独断」ことに近いですが、のは事実上の答えを与えることを試してみましょう:あなたのベースクラスに別の抽象メソッドを追加すること

  • はそれを実装するためにすべて派生クラスが必要ですもの。つまり、ベースクラスを必要以上に複雑にすることになります。
  • なぜですか?今後はの可能性があると思いますのでです。だから、YAGNIパターンを考えてみましょう。すぐには必要ないことに注意してください!
  • Bar()」メソッドが実際に「特別な」ものである場合。自然な結論は、この「機能」を表現する特定のインターフェースを作成することです。 classBが実装されています。

後であなたのクラスが同じBar()実装が必要になることが判明した場合。あなたはまだBarImpl()クラスを作成することができます。そのクラスのオブジェクトをBar()が必要なクラスに配置してください(良い古いFCoIをここで覚えておいてください)!

1

私は次のようBaseClassBarを追加することをお勧め:

public abstract class BaseClassBar : BaseClass 
{ 
    protected abstract void Bar();//if you don't want it to be public 
} 

その後、ClassABaseClassBarから継承されてみましょう:

public class ClassA : BaseClassBar 
{ 
    protected override void Foo() 
    { 
     Bar(); 
    } 
} 

これは有用であった希望。

関連する問題