たとえば、基本抽象クラスがあるとします
public abstract Foo
{
IFlyable _fly;
ISwimmable _swim;
void performSwim()
{
_swim.swim();
}
void performFly()
{
_fly.fly();
}
}
そして、システムに持つ動作/アルゴリズムを持っています
interface IFlyable { void fly(); }
interface ISwimmable { void swim(); }
interface IVoteable { void vote(); }
などなど
これで、IFlyable、ISwimmable などの具象を使用して、それを実装する複数のクラスができました。
class Bar: Foo { _swim = new ConcerteSwim(); }
class Baz: Foo { _fly = new ConcreteFly(); }
などなど
1 つは、Foo の基本クラスで戦略パターンを使用して動作を交換することです。
デコレーターパターンを使用して特定の動作でラップすることもできますが、デコレーターは基本クラスでラップするため、後でオブジェクトにさらに動作を追加する場合、基本クラスに触れずにオープンクローズ原則を実際に機能させるにはどうすればよいですか。これらの動作は、たとえばデコレータを呼び出すだけでなく、さらに追加すると異なるシグネチャを持つ可能性があるため
void performSwim()
{
swimWithMoreSpeed() + foo.performSwim()
}
私の質問は、動作を追加する場合、どうすれば基本クラスを変更せずに IWeaponBehavior、ISomeBehaviour をクラスに追加できるかということだと思います。
たとえば、私はクラスを持ちたいです
public class XYF: Foo
{
}
しかし、私はそれにISomeBehaviourのいくつかの動作を与えたいのですが、これらの種類の動作でそれをラップすると言うことができる方法はありますか、またはここではConcreteFooがこれらの動作でラップし、具体的なxyzにインターフェースを実装するのではなく何かをしますこれにより、swimbehavior、nullbehaviour などの非常に多くの種類の具体的な動作クラスを実装することになりますが、そこから抜け出す方法はありません。
デザインパターンでこれを行う方法はありますか? それはほとんどパターンのハイブリッドのように見えます。
アヒルのように歩き、アヒルのように鳴くが、バッテリーが必要な場合は、抽象化に問題があるように思えます。
これが理にかなっていることを願っています。