C # Стратегия шаблон дизайна проблемы - PullRequest
0 голосов
/ 11 августа 2011

У меня проблемы с дизайном классов. У меня есть абстрактный Chip класс, STM8 класс, который расширяет Chip и реализует IConfigurable (который имеет метод Configure).

Я ожидаю, что у каждого класса, который реализует IConfigurable, будет метод Configure, который принимает один аргумент, чтобы решить, что настраивать, используя шаблон стратегии (методы).

Код Psuedo:

public void Configure(Periphial p)
{
  this.periphials[p]();
}

Конечно, настройки для каждого класса различны. Например, STM8 может иметь GPIO и таймеры, а STM8L может иметь только GPIO. Тогда способ создания каждого подкласса должен быть глупым, поэтому я хотел бы заставить людей объявлять свои enum в своих классах.

Наконец, будет ли хорошей идеей инициализировать словарь с парой enum / делегат, чтобы показать, что можно настроить? this.periphials используется в псевдокоде выше?

Ответы [ 3 ]

3 голосов
/ 11 августа 2011

А что, если у вашего Periphial (вместо него будет называться Peripheral?) Был метод Configure?

foreach (Peripheral p in peripherals) {
    p.Configure();
}

или если ваш Peripheral вернул конфигуратор?

0 голосов
/ 11 августа 2011

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

Я думаю, вам следует проверить тип предоставленного Peripheral, который предоставляется Configure() и вернуть пользовательское исключение, если тип не является сторонником.

Так что для STM8L вы должны сделать:

public void Configure(Peripheral p)
{

  if (p is GPIO) ConfigureGPIO()
  else throw new NotAvailablePeripheralException(p);

}

Если бы у вас была возможность иметь некоторые перечисления для подклассовиз Chip, это было бы точно так же, как если бы вы могли определить Porperties, например myChip.GPIO.Использование наследования класса скрывает объект really во время компиляции ...

0 голосов
/ 11 августа 2011

Попробуйте работать с дженериками, если у вас не слишком много периферийных устройств. Поэтому создайте тип для каждого периферийного TPeripherial1, TPeripherial2 и т. Д. Затем сделайте общий интерфейс

interface IConfigurable<T> : where T TPeripherialBase
{
     void Configure<T>()
}

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

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