2008-12-12 1 views
0

Извините, если это действительно основной вопрос, но я борюсь с тем, как я должен атаковать это. Я пытаюсь обернуть несколько команд для объекта 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. 

Где anyhting между [] является необязательным.

Поэтому мне нужно создать класс позволяет называть его «CommandBuilder», который может будет установить методы для всех этих дополнительных сеттеров, то отлично, я могу справиться с этим, основной проблемой, у меня есть метод, который ToCommandString необходимо Ouput строки, которая будет выглядеть Somthing как:

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

Просто делают некоторые, если основаны на переменных, которые получают набор и соединение строки отлично работает, когда нет ничего сложного переменных создаются или есть только несколько переменных, но когда есть кучи переменных и/или вложенных значений, которые также являются необязательными, он может сделать метод 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. 

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

Будет ли это правильным путем?

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

ответ

0

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

2

Это звучит разумно для меня. Я бы определенно держать конструкцию экземпляров 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

Могу ли я просто что-то спросить? Почему вы возвращаете объект CommandBuilder из функции position? – 2008-12-12 04:01:32

 Смежные вопросы

  • Нет связанных вопросов^_^