3

私はライブラリ (.dll) ファイルに取り組んでおり、FatherTextBox と呼ばれる小さなカスタム TextBox を作成したいので、TextBoxBase (抽象クラス) から派生することから始めました。

カスタム ロジックをコーディングした後、次のエラー メッセージが表示されることに気付きました。

The type 'System.Windows.Forms.TextBoxBase' has no constructors defined

したがって、これはオプションではないと思います:

    public FatherTextBox() : base()
    {

    }

私の質問は次のとおりです。

  1. コンストラクターなしで抽象クラスから継承する方法は何ですか?
  2. TextBoxBase にコンストラクタがないのはなぜですか?
4

3 に答える 3

10

MSDNから:

通常、TextBoxBase から継承することはありません。独自のテキスト コントロール クラスを作成するには、TextBox または RichTextBox から継承します。

TextBoxBaseコンストラクターがあるinternalため、呼び出すことができません。

于 2012-10-30T19:45:35.273 に答える
4

クラスのソース コードを見てくださいTextBoxBase。2 つのコンストラクターがあります。

internal TextBoxBase()
{
    base.SetState2(2048, true);
    this.textBoxFlags[TextBoxBase.autoSize | TextBoxBase.hideSelection | TextBoxBase.wordWrap | TextBoxBase.shortcutsEnabled] = true;
    base.SetStyle(ControlStyles.FixedHeight, this.textBoxFlags[TextBoxBase.autoSize]);
    base.SetStyle(ControlStyles.UserPaint | ControlStyles.StandardClick | ControlStyles.StandardDoubleClick | ControlStyles.UseTextForAccessibility, false);
    this.requestedHeight = base.Height;
}

static TextBoxBase()
{
    // Note: this type is marked as 'beforefieldinit'.
    TextBoxBase.autoSize = BitVector32.CreateMask();
    TextBoxBase.hideSelection = BitVector32.CreateMask(TextBoxBase.autoSize);
    TextBoxBase.multiline = BitVector32.CreateMask(TextBoxBase.hideSelection);
    TextBoxBase.modified = BitVector32.CreateMask(TextBoxBase.multiline);
    TextBoxBase.readOnly = BitVector32.CreateMask(TextBoxBase.modified);
    TextBoxBase.acceptsTab = BitVector32.CreateMask(TextBoxBase.readOnly);
    TextBoxBase.wordWrap = BitVector32.CreateMask(TextBoxBase.acceptsTab);
    TextBoxBase.creatingHandle = BitVector32.CreateMask(TextBoxBase.wordWrap);
    TextBoxBase.codeUpdateText = BitVector32.CreateMask(TextBoxBase.creatingHandle);
    TextBoxBase.shortcutsEnabled = BitVector32.CreateMask(TextBoxBase.codeUpdateText);
    TextBoxBase.scrollToCaretOnHandleCreated = BitVector32.CreateMask(TextBoxBase.shortcutsEnabled);
    TextBoxBase.setSelectionOnHandleCreated = BitVector32.CreateMask(TextBoxBase.scrollToCaretOnHandleCreated);
    TextBoxBase.EVENT_ACCEPTSTABCHANGED = new object();
    TextBoxBase.EVENT_BORDERSTYLECHANGED = new object();
    TextBoxBase.EVENT_HIDESELECTIONCHANGED = new object();
    TextBoxBase.EVENT_MODIFIEDCHANGED = new object();
    TextBoxBase.EVENT_MULTILINECHANGED = new object();
    TextBoxBase.EVENT_READONLYCHANGED = new object();
}

最初のコンストラクターは内部であるため、型を定義する同じアセンブリのみがそれにアクセスできます。2 つ目は静的コンストラクターで、クラスの最初のアクセス時に呼び出されます。

今あなたの質問への答え:

  1. 抽象クラスにコンストラクターがない場合、継承に使用することは意図されていません。TextBoxたとえば、またはRichTextBoxあなたのニーズに合わせて、他のクラスがあります。

  2. クラスのアーキテクトはTextBoxBase、共通の OOP 原則であるカプセル化を使用して、すべてのテキスト ボックスのテキスト ボックス ベースを設計しました。カプセル化とは、要するに、複合型の実装の詳細を隠すことです。そして、これTextBoxBaseは非常に複雑です。

于 2012-10-30T20:04:37.770 に答える
-1

これを試して

   class Txt:TextBox

    {
        public Txt():base()
        {

        }
    }
于 2012-10-30T19:46:10.240 に答える