2012-10-30 70 views
3

我正在研究一個庫(.dll)文件,並且我想創建一個名爲FatherTextBox的小自定義文本框,所以我從派生自TextBoxBase(一個抽象類)開始。繼承自TextBoxBase

編碼定製邏輯後,我注意到,我收到此錯誤信息:

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

所以我想這不是一個選項:

public FatherTextBox() : base() 
    { 

    } 

我的問題是:

  1. 從沒有構造函數的抽象類繼承的方式是什麼?
  2. 爲什麼TextBoxBase沒有構造函數?

回答

10

MSDN

你通常不會從Control繼承。要創建自己的文本 控件類,請從TextBox或RichTextBox繼承。

TextBoxBase有一個internal構造,這就是爲什麼你不能調用它。

+0

所以不可能從TextBoxBase中混入? – samy

+0

@samy正確。從「TextBox」或「RichTextBox」繼承,或者類似於你想要的東西。 –

+0

好吧,我會這樣做謝謝:)但我想知道,爲什麼他們創建TextBoxBase,如果我們不能使用它? – samy

0

試試這個

class Txt:TextBox 

    { 
     public Txt():base() 
     { 

     } 
    } 
3

看那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 principe的所有文本框的文本框:Encapsulation。封裝僅用於隱藏複雜類型的實現細節。而TextBoxBase則相當複雜。

+0

哇,謝謝你的信息! – samy