2011-05-22 80 views
2

例子:C#泛型繼承的解決辦法

我想有一個無論從文本框或RichTextBox中派生幾個專門的文本框,這無論從Control派生:

class CommonFeatures<T> : T where T : TextBoxBase 
{ 
    // lots of features common to the TextBox and RichTextBox cases, like 
    protected override void OnTextChanged(TextChangedEventArgs e) 
    { 
     //using TextBoxBase properties/methods like SelectAll(); 
    } 
} 

然後

class SpecializedTB : CommonFeatures<TextBox> 
{ 
    // using properties/methods specific to TextBox 
    protected override void OnTextChanged(TextChangedEventArgs e) 
    { 
     ... base.OnTextChanged(e); 
    } 
} 

and

class SpecializedRTB : CommonFeatures<RichTextBox> 
{ 
    // using methods/properties specific to RichTextBox 
} 

不幸的是

class CommonFeatures<T> : T where T : TextBoxBase 

不編譯(「無法從‘T’派生,因爲它是一個類型參數」)。

有沒有很好的解決方案呢?謝謝。

+0

它應該是類CommonFeatures 其中T:TextBoxBase – 2011-05-22 20:08:00

+0

@Tomas Voracek好這一點,類CommonFeatures :其中T:TextBoxBase因爲CommonFeatures需要從它繼承TextBoxBase的方法/屬性,否則事情像OnTextChanged唐一類派生不存在。如果我直接從TextBoxBase繼承,如何從RichTextBox或TextBox稍後添加屬性/方法,而沒有多重繼承... – SemMike 2011-05-22 20:23:44

回答

6

C#泛型不從參數類型支持繼承。

您真的需要CommonFeatures來自TextBoxBase嗎?

一個簡單的解決方法可能是使用聚合而不是繼承。所以,你會有這樣的事情:

public class CommonFeatures<T> where T : TextBoxBase 
{ 
    private T innerTextBox; 

    protected CommonFeatures<T>(T inner) 
    { 
     innerTextBox = inner; 
     innerTextBox.TextChanged += OnTextChanged; 
    } 

    public T InnerTextBox { get { return innerTextBox; } } 

    protected virtual void OnTextChanged(object sender, TextChangedEventArgs e) 
    { 
     ... do your stuff    
    } 
} 

像@oxilumin說,擴展方法也可以是一個偉大的選擇,如果你並不真的需要CommonFeatures是一個TextBoxBase

+0

謝謝,我想我會做到這一點,我想你的意思是: 類SpecializedRTB:RichTextBox的 { \t私人CommonFeatures CF =新CommonFeatures (本); \t // SpecializedRTB的TextChanged事件已被捕獲。 } 我怎麼沒想到:) – SemMike 2011-05-22 20:45:37

1

如果您的CommonFeature類沒有它自己的條件 - 您可以使用擴展方法。

public static class TextBoxBaseExtensions 
{ 
    public static YourReturnType YourExtensionMethodName(this TextBoxBase textBoxBase, /*your parameters list*/) 
    { 
     // Method body. 
    } 
} 

然後你就可以用同樣的方式與所有真正的類的方法,使用這種方法:

var textBox = new TextBox(); 
textBox.YourExtensionMethodName(/* your parameters list */); 
+0

謝謝,我會研究一下,但這樣做是否允許受保護的override機制?我不得不加入 保護覆蓋無效OnTextChanged(TextChangedEventArgs e){... base.ExtensionOnTextChanged(e); } 在這兩個類中的手? – SemMike 2011-05-22 20:19:43

+0

@SemMike:不,用擴展方法只能訪問公共類的成員。 – oxilumin 2011-05-22 20:27:39