Как вызвать общего члена на типах с разными типами? - PullRequest
0 голосов
/ 02 декабря 2009

У меня есть различные наборы пользовательских элементов управления Winforms, все производные от Control, такие как:

CalculatorPanel, GraphPanel, DisplayPanel, etc : Control

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

У каждого из них есть член по имени:

Input

где тип отличается, например:

CalculatorInput, GraphInput, DisplayInput, etc.

Как мне сохранить их в списке или другой коллекции, где я могу без проблем вызвать свойство Input?

Должен ли я использовать общий интерфейс для каждого? Тогда это должно быть общим. Как я укажу тип?

Сейчас я использую что-то вроде этого для добавления / удаления элементов управления:

Panels = Dictionary <Enum, Control> ...
Panels.Add (PanelType.Calculator, new CalculatorInput ().Controls);
...

так что позже я могу сказать:

Form.Add/RemoveControls (Panels[PanelType.Calculator])

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

Есть шаблон проектирования или методика для решения этой проблемы?

РЕДАКТИРОВАТЬ: Свойства каждого типа ввода (без методов) являются следующими:

CalculatorInput:
.Result
.LastOperation
...

GraphInput:
.Result
.SelectedNode
...

DisplayInput:
.Result
.CurrentColor
...

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

EDIT2:

Таким образом, все эти входные данные являются отдельными без наследования и т. Д.

Но определяются в соответствующих выпусках следующим образом:

class CalculatorPanel
{
    CalculatorInput Input
}

class GraphPanel
{
    GraphInput Input
}

class DisplayPanel
{
    DisplayInput Input
}

Ответы [ 2 ]

2 голосов
/ 02 декабря 2009

Я думаю, что вам нужен ИНТЕРФЕЙС для вашего Ввода, от которого все классы будут наследовать ..

public interface MyInputInterface
{
        void YourInputFunction();
}

public class CalculatorPanel : Control, MyInputInterface
{
   ..
   ..

   void MyInputInterface.YourInputFunction()
   {
       // do your code specific to calculator panel here
   }
}

public class GraphPanel : Control, MyInputInterface
{
   ..
   ..

   void MyInputInterface.YourInputFunction()
   {
       // do your code specific to graph panel here
   }
}

Затем вы можете создать список всего, что реализует MyInputInterface

public List<MyInputInterface> MyInputList = new List<MyInputInterface>();

и работать с этим списком по мере необходимости ... Интерфейс - это контракт любого объекта, использующего его для гарантии того, что он имеет связанные свойства, поля, функции и т. Д.

0 голосов
/ 02 декабря 2009

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

if (currentControl is CalculatorPanel)
{
    CalculatorInput input = (currentControl as CalculatorPanel).Input;
    // ...
}
else if (currentControl is GraphPanel)
{
}
etc.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...