0

次の C# クラスがあります。

class BufferedSplitPanel : SplitterPanel
{
    public BufferedSplitPanel()
    {
         this.DoubleBuffered = true;
    }
}

しかし、コンパイラ (および Intellisense)は、そのようなメンバー(またはそのことについては他のメンバー)thisがないと教えてくれます。DoubleBufferedMSDN は、Panel から継承しているため、そうであると明確に述べています。をに変更するSplitterPanelPanel、コンパイルされます。私は何を間違っていますか?

4

2 に答える 2

2

SplitterPanelsealedクラスですが、Panelそうではありません。

型から派生することはできませんsealed

ドキュメント:

シール クラスは継承できません。シール クラスを基底クラスとして使用するのはエラーです。クラスの継承を防ぐには、クラス宣言で seal 修飾子を使用します。

クラスの機能を拡張したい場合sealed、[IMO] の最善の方法は拡張メソッドを作成することです。例えば:

public static class SplitterPanelExtensions {
    public static void MyAdvancedMethod(this SplitterPanel splitterPanel) {
        /*
         * Check if splitterPanel is null and throw ArgumentNullException.
         * because extension methods are called via "call" IL instruction.
         */
        //Implementation.
    }

    //Other extension methods...
}

もう 1 つの方法は、sealed クラスのインスタンスを保持するクラスを作成することです。ラップしているクラスのインターフェースの一部を隠したい場合は、これがより良い選択です。例えば:

public class SplitterPanelWrapper {
    private readonly SplitterPanel m_SplitterPanel;

    public SplitterPanelWrapper(SplitterPanel splitterPanel) {
        m_SplitterPanel = splitterPanel;
    }

    //Other implementation. 
}
于 2013-03-01T07:29:20.917 に答える
1

MSDN ドキュメントに DoubleBuffered プロパティがありません。本当にそのプロパティが必要ですか? 使ってもあまり意味がないようです。

それとは別に、MSDN はクラスが封印されているとも述べています。そこから派生することはできません。コンパイラ エラーが発生するはずです。

于 2013-03-01T07:28:33.303 に答える