2013-04-20 3 views
1

У меня есть некоторые классы, имеющие контроль .NET:Multiple inhertinace

Class MyTextBox : Inherits MyControl 
    Control As TextBox 

Я хотел бы использовать наследование вместо того, чтобы иметь переменную, содержащую элемент управления .NET:

Class MyTextBox : Inherits TextBox 

Так как множественное наследование не поддерживается в .NET, есть ли способ для меня наследовать от класса MyControl и иметь всю реализацию .NET TextBox?

Class MyControl : Inherits Control 

Class MyTextBox : Inherits MyControl 
    (all methods, property, events of the TextBox class) 

Так что я могу иметь все атрибуты/операции в TextBoxes, ComboBoxes и все, что в моих подклассах плюс мой личной и родовой АЦЕ/OPS на моем классе MyControl унаследовали от subones.

ответ

3

Как вы сказали, .NET (и большинство современных языков и сред OOP) не будет поддерживать многонаделение - и это хорошее дизайнерское решение.

Не обходное решение, а фактическое решение упаковка.

Если вы хотите, чтобы ваш контроль, чтобы быть MyControl, а также TextBox там уже другие способы получения таких отношений: интерфейсов.

Ваш специализированный TextBox должен наследовать класс управления .NET TextBox и реализовать интерфейс IMyControl.

Функциональность, которую должен реализовывать SpecializedTextBox, может быть реализована в отдельном классе и использовать ее члены в реализации IMyControl по адресу SpecializedTextBox.

Я собираюсь записать образец в C#, но это должно быть достаточно для вас, как вы VB.NET разработчик и решение зависит от языка:

public interface IMyControl 
{ 
    void Do(); 
} 

public class SpecializedTextBox : TextBox, IMyControl 
{ 
    private readonly MyControlExtension _extension = new MyControlExtension(this); 

    public MyControlExtension Extension 
    { 
      get { return _extension; } 
    } 

    public void Do() 
    { 
      Extension.Do(); 
    } 
} 

public class MyControlExtension 
{ 
    public MyControlExtension(Control wrappedControl) 
    { 
     _wrappedControl = wrappedControl; 
    } 

    private readonly Control _wrappedControl; 

    public Control WrappedControl { get { return _wrapedControl; } } 

    public void Do() 
    { 
     // Do some stuff with the WrappedControl property contained control 

    } 
} 

Теперь SpecializedTextBox управления есть оба IMyControl и TextBox членов.

Насколько я знаю, этого будет достаточно, чтобы имитировать multi-inheritance, поскольку класс может реализовать один или несколько интерфейсов.

+0

Действительно полезный и ясно, спасибо. –

+0

@Uno Нет проблем !! –

+0

+1, Хорошая работа! –