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,有两个构造函数:

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();
}

第一个构造函数是内部的,因此只有定义该类型的同一程序集才能访问它。第二个是静态构造函数,它在类的第一次访问时被调用。

现在回答你的问题:

  1. 如果抽象类没有构造函数,则它不打算用于继承。还有其他课程,例如TextBoxRichTextBox满足您的需要。

  2. 该课程的架构师TextBoxBase为所有文本框设计了一个文本框基础,具有共同的 OOP 原则:封装。封装简称为隐藏复杂类型的实现细节。而且TextBoxBase相当复杂。

于 2012-10-30T20:04:37.770 回答
-1

试试这个

   class Txt:TextBox

    {
        public Txt():base()
        {

        }
    }
于 2012-10-30T19:46:10.240 回答