6

テンプレートメソッドパターンは、抽象基本クラスにオーバーライドできないメソッドがあることを提供します。このメソッドは、共通のアルゴリズムを実装するため、サブクラスでオーバーライドしないでください。Javaでは、テンプレートメソッドはfinal抽象基本クラス内で宣言されます。C#では、sealedキーワードは同様の意味を持ちますが、オーバーライドされないメソッドは宣言できませんsealed

public abstract class Base
{
    protected abstract AlgorithmStep1();

    protected abstract AlgorithmStep2();

    public sealed void TemplateMethod()   // sealed: compile error
    {
        AlgorithmStep1();
        AlgorithmStep2();
    }
}

どうすればこの問題を解決できますか?メソッドが(C#の)サブクラスによってオーバーライドされるのを防ぐことができないのはなぜですか?

4

3 に答える 3

8

修飾子は、sealed基本クラスのメンバーをオーバーライドしている関数メンバーに対してのみ有効であり、派生クラスに対して仮想化されないようにします。関数メンバーは、C#ではデフォルトで非仮想です(Javaとは異なります)。ただし、クラスsealedの修飾子は引き続き必要です。デフォルトでは、クラスは封印されていません。

sealedメソッドから修飾子を削除するだけで問題ありません。

封印されたメソッドの詳細については、C#4仕様のセクション10.6.5を参照してください(封印されたプロパティとイベントは、それぞれセクション10.7.5と10.8.4にあります)。

インスタンスメソッド宣言にsealed修飾子が含まれている場合、そのメソッドは封印されたメソッドと呼ばれます。インスタンスメソッド宣言にsealed修飾子が含まれている場合は、修飾子も含める必要がありますoverride。修飾子を使用するとsealed、派生クラスがメソッドをさらにオーバーライドするのを防ぐことができます。

于 2012-08-15T17:50:44.667 に答える
1

sealedキーワードを削除するだけです。デフォルトでは、メソッドはオーバーライドできません。サブクラスはそれらをオーバーライドできず、非表示にするだけです。

于 2012-08-15T17:50:53.050 に答える
1

C#メソッドはデフォルトで封印されています

于 2012-08-15T17:51:08.477 に答える