その抽象クラスのサブクラスではないインターフェイス実装者をそのインターフェイスの抽象クラスのように動作させるにはどうすればよいですか?

蜂-

私の質問を例を挙げて説明したいと思います。私がインターフェースを持っているとしましょう:

interface IActionPerformer
{
    bool IsReadyToExecuteAction();
    void Action();
    IActionImplementor GetImplementor();
}

そしてAction()メソッドの実装者それが正しいか間違っているかはわかりませんが、とにかく読み続けて、私の目的を説明します。実装者:

interface IActionImplementor
{
   void Action();
}

そして、以下を実装する抽象クラスIActionPerformer

abstract class ActionPerformerBase: IActionPerformer
{
   private IActionImplementor _implementor;
   public abstract bool IsReadyToExecuteAction();
   public IActionImplementor GetImplementor()
   {
      return _implementor;
   }
   public void Action()
   {
      if (IsReadyToExecuteAction())
      {
         GetImplementor().Action();
      }
   }

   protected ActionPerformerBase(IActionImplementor implementor)
   {
      this._implementor = implementor;
   }
}

この抽象クラスから継承するサブクラスは、実行の準備ができている場合にのみ実際のアクションを実行します。

しかし、別のスーパークラスから継承するオブジェクトがソフトウェアにあるとしましょう。ただし、同時に、このオブジェクトはのように動作する必要がありますIActionPerformerつまり、このオブジェクトは次のIActionPerformerようなインターフェイスを実装する必要があります。

class SomeOtherSubClass : SomeOtherSuperClass, IActionPerformer

この時点で、実行のAction()準備ができているかどうかを制御してメソッドを実行したいと思います。

別のオブジェクトでメソッドを呼び出すことが解決策になるかもしれないと思いました。つまり、コントローラーまたはハンドラーオブジェクトは、パラメーターとしてインターフェイスを取得し、必要な方法でメソッドを呼び出します。お気に入り:

IActionInvoker.Invoke(IActionPerformer performer)
{
   if (performer.IsReadyToExecuteAction())
   {
      performer.Action();
   }
}

または、すべてのIActionPerformer実装者は、次のような実際のコントロールを処理するIActionPerformeror ActionPerformerBase(気分が良くなる)オブジェクトを持っています。

class SomeOtherSubClass : SomeOtherSuperClass, IActionPerformer
{
   ActionPerformerBase _realHandler;
   public bool IsReadyToExecuteAction()
   {
      return _realHandler.IsReadyToExecuteAction();
   }
   public void Action()
   {
      _realHandler.Action();
   }
   .
   .
   .
}

//This is the one get the job done actually.
class RealHandlerOfSomething : ActionPerformerBase

私の質問を説明しようとすると、それほど明確ではないかもしれません。私は、抽象化、デザインパターン、およびそのようなもののような概念に不慣れです。そしてそれらを理解しようとしています。これはデコレータのように見えます、それはでありIActionPerformer、それはIActionPerformerです。しかし、デコレータパターンを調べたところ、シェルからコアに移動するようなものでした。つまり、すべてのオブジェクトがそのメソッドとラップされたオブジェクトのメソッドを実行します。私の例では少し異なります。つまり、質問です。これは私たちが「カプセル化」と呼んでいるものですか?それとも、概念を理解する上で大きな問題がありますか?

私は自分自身をはっきりと説明したと思います。助けようとして読んでくれたみんなに感謝します。

良い昼/夜を。

マーク・シーマン

デザインパターンのチャプター1で述べて:

クラス継承よりもオブジェクトコンポジションを優先する

これは1994年のことでした。継承は物事を複雑にします。OPは別の例です。

以下はそのままにIActionPerformerActionPerformerBaseおきます以来、継承が組成物に同型である、このような多重継承をエミュレートするように、より多くのと- 、あなたが相続で行うことができますすべてのもの、あなたはまた、組成物で行うことができます。

IActionPerformer別のサブクラスからインターフェイスを実装し、それでも再利用する方法はActionPerformerBase次のとおりです。

public class SomeOtherSubClass : SomeOtherSuperClass, IActionPerformer
{
    private readonly ActionPerformerBase @base;

    public SomeOtherSubClass(ActionPerformerBase @base)
    {
        this.@base = @base;
    }

    public void Action()
    {
        // Perhaps do something before calling @base...
        @base.Action();
        // Perhaps do something else after calling @base...
    }

    // Other methods of IActionPerformer go here, possibly following the same pattern...
}

SomeOtherSubClass任意ActionPerformerBase構成しActionPerformerBase、必要な機能を備えているため、その機能は効果的に再利用されます。

継承の代わりにコンポジションを使用して再利用する方法を理解したら、自分に有利に働き、コードベースから継承を排除します。私を信じてください、あなたはそれを必要としません。私は10年以上、継承なしで製品コードを設計および作成してきました。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ