Наследование от пользовательского элемента управления для использования другого дочернего элемента управления - PullRequest
3 голосов
/ 05 января 2010

У меня есть пользовательский элемент управления, GridMasterControl , который содержит (помимо прочего) другой элемент управления, называемый Grid .

Теперь мне нужно наследовать от Сетка для создания EditableGrid (чтобы добавить функциональность редактирования в сетку).

Затем мне нужно создать EditableGridMasterControl , который будет идентичен GridMasterControl , за исключением того, что он будет использовать EditableGrid , а не Grid .

У обоих способов реализации этого есть свои проблемы.

1. Я мог бы скопировать и вставить GridMasterControl и просто изменить Сетка на EditableGrid . Плохая идея (дублирование кода не очень хорошо).

2. Я мог бы получить EditableGridMasterControl для наследования от GridMasterControl , затем добавить виртуальную функцию CreateGrid в GridMasterControl . EditableGridMasterControl может реализовать это для создания элемента управления EditableGrid . Это тоже очень плохая идея, так как мне нужно изменить файл конструктора, чтобы создать элемент управления. Мне нужно сохранить файл конструктора в чистоте.

Как лучше всего это реализовать?

EDIT

Просто чтобы прояснить, я думаю, суть проблемы в том, что Visual Studio не позволяет вам изменять файлы конструктора, которые он создает (или, по крайней мере, это очень плохая идея), и я хочу иметь возможность условно создать другой класс в зависимости от ситуации.

Ответы [ 4 ]

4 голосов
/ 05 января 2010

Не могли бы вы иметь один элемент управления EditableGridMasterControl, обладающий свойством ReadOnly? Если для этого параметра установлено значение true, редактирование отключается. Это дает вам только один набор элементов управления для обслуживания, но требует, чтобы элемент управления был более продвинутым, чем простой GridMasterControl.

3 голосов
/ 05 января 2010

Возможно, вы могли бы использовать шаблон композиции для повторного использования ваших общих функций между различными элементами управления.

1 голос
/ 05 января 2010

Если вы хотите сохранить файл конструктора одинаковым для обоих, попробуйте следующее: вместо того, чтобы перетаскивать фактический элемент управления Grid на ваш GridMasterControl, просто перетащите панель в качестве заполнителя.

Затем создайте обязательный шаг инициализации, где создается соответствующий объект сетки (используйте интерфейс, такой как IGrid). Это можно сделать в производном классе.

Вот что я имею в виду, конечно, вы можете реализовать один и тот же шаблон несколькими разными способами. Объем кода, который вы разделяете между конкретными реализациями AbstractGridMasterControl, может варьироваться и зависит от того, насколько похожи элементы управления (о чем я не знаю). Вместо интерфейса IGrid вы можете использовать родительский класс - опять же, важно, как вы хотите наследовать.

interface IGrid {...}
class Grid : IGrid { ...}
class EditableGrid : IGrid { ... }

abstract class AbstractGridMasterControl
{
    protected IGrid Grid
    {
        set { this.panelControl.Controls.Add(value as Control);}
    }
}

class GridMasterConrol : AbstractGridMasterControl
{
    public GridMasterControl()
    {
        this.Grid = new Grid();
    }
}

class EditableGridMasterConrol : AbstractGridMasterControl
{
    public GridMasterControl()
    {
        this.Grid = new EditableGrid();
    }
}
0 голосов
/ 05 января 2010

Если GridMasterControl делает то же самое для любого класса сетки, вам не нужно ничего менять: член Grid в GridMasterControl может содержать EditableGrid.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...