基本クラスで関数を実装したいが、のたびに、派生クラスでオーバーライドしたい。だから、「抽象的な機能だが身体がある」ようなものだ。メソッドはオーバーライドする必要がありますが、抽象メソッドではありませんか?
私は何を探していますか?私は正しいものを探していますか?
基本クラスで関数を実装したいが、のたびに、派生クラスでオーバーライドしたい。だから、「抽象的な機能だが身体がある」ようなものだ。メソッドはオーバーライドする必要がありますが、抽象メソッドではありませんか?
私は何を探していますか?私は正しいものを探していますか?
基底クラスは、言いたいことがありますが、「毎回」それはオーバーライドされたい、そして私は、メソッドのペアを持っている希望の場合:
public void DoSomething() {
//things to do before
DoSomethingCore();
//things to do after
}
protected abstract void DoSomethingCore();
あなたはvirtual
法(使用を探していますメソッドをオーバーライドできるようにするためのこの修飾子)が、ユーザーに強制的に上書きすることはできません。とにかくbase.YourMethod()を呼び出すだけで、何もしなくても、最初はメソッドをオーバーライドしないのと同じことをするので、これを強制するのは意味がありません。
public virtual YourMethod() {
// your base class code here
}
し、別のクラスでオーバーライドするメソッド:
public override YourMethod() {
// code to do before the base call
base.YourMethod();
// code to do after the base call
}
あなたの基本クラスメソッドで何かをしていますが、すべてのサブクラスがいくつかを実装することを余儀なくされていることを確認するにはメソッドの一部である場合、Marc Gravellの答えに記載されているようにTemplate Method patternが必要です。
基本クラスにデフォルト実装を提供する方法はなく、サブクラスが独自の実装を提供するよう強制します。ただし、抽象基本クラスを作成し、それを継承してデフォルトの実装を提供することはできますが、その具体的なクラスを密接にすることができます。
public abstract class FooBase {
public abstract void DoStuff();
}
public sealed class FooImpl : FooBase {
public override void DoStuff {
//default widget-munging code
}
}
は今FooBaseから継承するすべてのクラスがDoStuff()を実装する必要がありますが、あなたは、サブクラスが継承していない可能性があるから、デフォルトの実装FooImplを持っています。
また、メソッドを実装する責任を別のクラスに委任することもできます。このクラスは、コンストラクターの基本クラスに渡されます。これはStrategy patternと呼ばれています。
public sealed class Foo {
private IFooStrategy _strategy;
public Foo(IStrategy strategy) {
_strategy = strategy;
}
void DoStuff() {
_strategy.DoStuff();
}
public static IFooStrategy DefaultStrategy {
//return singleton instance of the default strategy
}
}
は今の代わりにはFooをサブクラス化するのは、代わりにIFooStrategyインタフェースの新しい実装を作成し、あなたのFooのインスタンスにそれらを渡します。だから、何ができるのいずれか:
new Foo(Foo.DefaultStrategy);
または
new Foo(new DifferentStrategy());
をお使いのベースの実装が呼び出されませんように聞こえます。あなたは誰にも到達できない実装を提供したいのですが(フープを飛び越えずにジャンプする)
そして、あなたはテンプレートメソッドパターンについて言及するつもりでしょうか(簡略化のために撮影しているかもしれません) –
DoSomethingメソッドの前にある "virtual"キーワードはどうですか? – Kamarey
@Kamarey DoSomethingメソッドは仮想ではありません。サブクラスが上書き/実装すると予想されるのはDoSomethingCoreメソッドです。 – ChrisW