наследование элементов управления Windows Forms в C # - PullRequest
0 голосов
/ 24 февраля 2012

У меня есть пользовательский элемент управления для LayoutPanel, который содержит дочерние элементы управления. Я хочу убедиться, что все дочерние элементы управления содержат определенное свойство из родительского контейнера панели макета. Я попытался использовать следующий код для создания различных дочерних элементов управления, которые обеспечат хранение свойства ChartPropertyOwner , полагаясь на наследование для принятия типа (метки, кнопки, стандартные элементы управления формами)

public partial class ManipControl : System.Windows.Forms.Control {

        public ChartPropertySet ChartPropertyOwner { get; set; }

        public ManipControl(ChartPropertySet _cps) {
            ChartPropertyOwner = _cps;
            InitializeComponent();
        }
}

Я инициализирую следующим утверждением:

Button btnManipDel= new ManipControl(_cps);

Я получаю ошибку:

Невозможно неявно преобразовать тип 'ManipControl' в 'System.Windows.Forms.Button'

Почему неявное преобразование терпит неудачу и как мне решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 24 февраля 2012

ManipControl-> System.Windows.Forms.Control

Button-> System.Windows.Forms.Control

Кнопка не гарантированно является ManipControl

Чтобы решить эту проблему, вы можете просто явно привести к Button.

Button btnManipDel= (Button)new ManipControl(_cps);

Я не знаю, что это лучшее, что можно сделать в качестве кнопки! = ManipControl. Единственные гарантированные функции будут исходить из их базового класса System.Windows.Forms.Control. Это лучший класс для каста, и я верю, что он будет неявно (но не положительный):

System.Windows.Forms.Control btnManipDel= new ManipControl(_cps);

Возможно, вы захотите прочитать Принцип субстанции Лискова , а также контрвариантность и ковариантность.

0 голосов
/ 24 февраля 2012

Преобразование завершается неудачно, поскольку, хотя ManipControl является элементом управления, а Button является элементом управления, ManipControl не является кнопкой.

Вы можете изменить свой класс на интерфейс и создать новую ManipButton:

public interface IManipControl
{
    int ChartPropertyOwner { get; set; }
}

public class ManipButton : Button, IManipControl
{
    public int ChartPropertyOwner{get;set;}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...