2012-03-08 7 views
2

私は共通の機能を共有している、(わずかに異なる)同様のクラスで実行できる多くのタスクを持っています。抽象クラスまたは部分クラス?

私の意図は、この機能を親クラスに抽出することです。これを実装したくないため、abstractとマークしました。

しかし、すべての呼び出し元クラスは、抽出された共通機能を含むための単一のメソッドを呼び出します。私はoverride親クラスのメソッドにしたくないですが、私はそれが 子クラスで定義されているものに実行されたいです。

私は当初、これが部分的な方法の仕事だと思っていましたが、これはセマンティクスを幾分破ると思います。だから、私にとって最善の方法は何ですか?トンネルビジョンを少し経験しています。

+0

申し訳ありませんが、これを少し明確にすることができますか?親クラスのメソッドをovverideしたくないのですが、子クラスで定義されているものに加えて、そのメソッドを実行したいのです。子クラスであなたの機能はどこに定義されていますか? – Paddy

答えて

6

あなたはこのようにそれを行うことができます:

public abstract class Parent 
{ 
    public void TheSingleMethod() 
    { 
     CommonFunctionality(); 

     InternalDo(); 
    } 

    protected abstract void InternalDo(); 

    private void CommonFunctionality() 
    { 
     // Common functionality goes here. 
    } 
} 

public class Derived : Parent 
{ 
    protected override void InternalDo() 
    { 
     // Additional code of child goes here. 
    } 
} 
+0

オーバーライドされたメソッドでbase.InternalDo()を呼び出さないのはなぜですか? –

+0

その理由は、あなたがそれを強制することができないということです。すべての派生クラスに対して共通の機能が実行されるように*強制する場合は、私が示した方法があります。 *オプション*の場合、あなたの提案は行く方法です。 –

+0

ああ、私は彼の必要性を今より良く理解しています。いい視点ね! –

0

構図のような音とDecorator patternが別のオプションになる可能性があります。

1

サウンズあなたが必要とするようにTemplate method

abstract class BaseClass { 
    public void Common Method() { 
     // Common tasks 

     // Call template method 
     this.SubclassSpecificMethod(); 

     // Can also do more code after the call to the template method 
    } 

    protected abstract void SubclassSpecificMethod(); 
} 
0

のために、あなたも行うことができます。

abstract class BaseClass 
{ 
    public void Method() { 
     // Common tasks 
    } 
} 

class RealClass : BaseClass 
{ 
    public void Method() { 
     base.Method(); 
     // custom tasks for this class 
    } 
} 
+0

このメソッドは、すべての子に対して共通の機能が実行されることを強制しません。もう少し詳しくは、[私の解説のコメント](http://stackoverflow.com/questions/9615909/abstract-classes-or-partial/9615974#comment12201179_9615974)を参照してください。 –

+0

私は知っていますが、作者はそれを要求しませんでした。私の方法は、より柔軟性を提供します。著者の要望に応じて、どちらか一方が道のりです。 – Deadeye

+0

はい、彼はそれを要求しました: "私は親クラスのメソッドをオーバーライドするのではなく、子クラスで定義されているものに加えて実行させたい" –

関連する問題