Обходное решение для общего наследования в C # - PullRequest
2 голосов
/ 23 мая 2011

Пример:

Я хотел бы иметь несколько специализированных текстовых полей, которые являются производными либо от TextBox, либо от RichTextBox, которые оба являются производными от TextBoxBase:

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

и

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

К сожалению

class CommonFeatures<T> : T where T : TextBoxBase

не компилируется («Невозможно получить из« T », потому что это параметр типа»).

Есть ли хорошее решение для этого? Спасибо.

Ответы [ 2 ]

6 голосов
/ 23 мая 2011

Обобщения 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.

1 голос
/ 23 мая 2011

Если ваш 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 */);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...