私の質問を例を挙げて説明したいと思います。私がインターフェースを持っているとしましょう:
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
実装者は、次のような実際のコントロールを処理するIActionPerformer
or 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は別の例です。
以下はそのままにIActionPerformer
しActionPerformerBase
ておきます。以来、継承が組成物に同型である、このような多重継承をエミュレートするように、より多くのと- 、あなたが相続で行うことができますすべてのもの、あなたはまた、組成物で行うことができます。
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]
コメントを追加