Будет ли это хорошим случаем для полиморфизма - PullRequest
0 голосов
/ 12 декабря 2008

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

Set Window window_id
    //Units is part of the position setter.
    [ Position ( x, y ) [ Units paper_units ] ] 
    [ Width win_width [ Units paper_units ] ] 
    [ Height win_height [ Units paper_units ] ]
    ..... this goes on for about 20+ commands, all optional.

Если что-либо между [] необязательно.

Итак, мне нужно создать класс, давайте назовем его « CommandBuilder », который может иметь методы set для всех этих опциональных сеттеров, и это нормально, я могу справиться, главная проблема, с которой я сталкиваюсь, это Метод ToCommandString, которому нужно вывести строку, которая будет выглядеть примерно так:

Set Window 1 Position (x,y) Units "m" Height 100 Units "m" + what ever else the user added

Простое выполнение нескольких if на основе переменных, которые устанавливаются, и присоединение строки прекрасно работает, когда нет ничего сложного в том, что устанавливаемые переменные или есть только несколько переменных, но когда есть куча переменных и / или вложенных значений, которые также необязательны, это может сделать метод ToString очень длинным и сложным + сложным в обслуживании, если что-то изменится.

Мне было интересно, смогу ли я решить эту проблему, используя полиморфизм, выполнив что-то подобное.

interface ICommand
{
    string ToCommandString();
}

class PositionCommand : ICommand
{
    double X;
    double Y;
    string Units;

    public PositionCommand(double x, double y)
    {
        this.X = x;
        this.Y = y;
    }

    public PositionCommand(double x,double y, string units)
    {
        this.X = x;
        this.Y = y;
        this.Units = units;
    }

    public string ToCommandString()
    {
        //Add more stuff here to handle empty units.
        return String.Format(" Postion ({0},{1})", X.ToString(), Y.ToString());
    }
}
....more command classes.

Тогда все мои методы set в " CommandBuilder " могут просто создать правильный тип команды, добавить его в список, тогда основная ToString в методе " CommandBuilder " может пройти через все те, которые были установлены и вызывают ToCommandString, и не нужно беспокоиться о выполнении каких-либо проверок или нулевых проверок.

Это будет правильный путь?

P.S. Если вам нужна дополнительная информация, я был бы рад добавить, просто не хотел делать это долго сначала.

Ответы [ 2 ]

2 голосов
/ 12 декабря 2008

Это звучит разумно для меня. Я бы определенно сохранил конструкцию экземпляров ICommand внутри CommandBuilder:

class CommandBuilder
{
  private List<ICommand> _commands = new List<ICommand>();

  public CommandBuilder Position(double x, double y)
  {
    _commands.Add(new PositionCommand(x,y))
    return this;
  }

  ...
}

Вместо

class CommandBuilder
{
  public void AddCommand(ICommand cmd)
  { ... }
}
0 голосов
/ 12 декабря 2008

Да. Я думаю, вы достаточно хорошо это поняли.

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