0

私は素晴らしいことをしている良い完全なクラスを持っています。一部のメソッドを置き換えて、ユーザーがこのクラスを使用できるようにする必要がありますが、このクラスは他のアプリケーション クラスでも使用されるため、継承は許可されません。

テーブルを作成するクラスがあるようですが、ユーザーがテーブルセルを作成するメソッドを再定義して、ユーザーがこのセルに何かカスタムを印刷できるようにする必要があります。ただし、このクラスには、セルの内容を出力するデフォルトの方法があります (ユーザーがカスタマイズする必要がない場合)。

これを達成するために一般的に使用されている、または標準化された方法はありますか?

4

3 に答える 3

7

更新しました

「ピーナッツギャラリー」に私のアプローチ(下部)が法案に合わないことを指摘してもらったので、別の方法を次に示します。

委任を使用します。Action または Func タイプの特定のパブリック プロパティを定義します。これらの動作をコードで呼び出す必要がある場合は、プロパティを null と比較してください。null の場合、デフォルトの動作を使用します。そうでない場合は、値を呼び出します。

呼び出し元のコードでプロパティを設定できますが、設定する必要はありません。

(最初の試行)代替アプローチ:

拡張メソッド、または利用可能な場合は継承の使用について説明しています。

拡張メソッドを使用すると、新しい派生型を作成したり、再コンパイルしたり、元の型を変更したりすることなく、既存の型にメソッドを「追加」できます。拡張メソッドは特別な種類の静的メソッドですが、拡張された型のインスタンス メソッドであるかのように呼び出されます。C# と Visual Basic で記述されたクライアント コードの場合、拡張メソッドの呼び出しと、型で実際に定義されているメソッドの呼び出しに明確な違いはありません。

https://msdn.microsoft.com/en-us//library/bb383977.aspx

継承は、カプセル化とポリモーフィズムと共に、オブジェクト指向プログラミングの 3 つの主要な特徴 (柱) の 1 つです。継承により、他のクラスで定義されている動作を再利用、拡張、および変更する新しいクラスを作成できます。メンバーを継承したクラスを基底クラス、そのメンバーを継承したクラスを派生クラスと呼びます。派生クラスは、直接基底クラスを 1 つだけ持つことができます。ただし、継承は推移的です。ClassC が ClassB から派生し、ClassB が ClassA から派生した場合、ClassC は ClassB および ClassA で宣言されたメンバーを継承します。

https://msdn.microsoft.com/en-us/library/ms173149.aspx

すべての .NET 型から派生できるわけではありませんが、それらの拡張メソッドを作成できます。

于 2016-11-10T21:37:44.630 に答える
1

既存のクラスを変更できると仮定すると、メソッドをvirtualとしてマークする必要があります。

これにより、デフォルトの実装 (既存のコードで使用されるもの) を提供し、必要に応じてカスタム実装でオーバーライドすることができます。

基本クラスは、次のようなものになる可能性があります。

public class TableMaker
{
    public virtual string MakeTable()
    {
        //Provide default implementation used by existing code here
    }
}

継承クラスは、仮想メソッドをオーバーライドできます。

public class SpecialTableMaker : TableMaker
{
    public override string MakeTable()
    {
        //Provide specific implementation for cell text here
    }
}

既存のコードは問題なく動作し、必要に応じてこの他のクラスを使用できます。

于 2016-11-10T21:48:40.947 に答える