这对于多态是否是一个好例子

时间:2008-12-12 02:57:06

标签: c# .net polymorphism

很抱歉,如果这是一个非常基本的问题,但我在努力解决这个问题。我正在尝试为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 ”,它可以为所有这些可选的setter设置方法,我可以处理它,我遇到的主要问题是ToCommandString方法,需要输出一个类似于:

的字符串
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 ”中设置的所有方法都可以创建正确的命令类型将其添加到列表中,然后“ CommandBuilder ”方法中的主ToString可以循环通过所有已设置的并调用ToCommandString,不必担心如果进行任何判断或空检查。

这是正确的方法吗?

P.S。如果你需要更多的信息,我会很乐意添加,只是不想让它很长时间去。

2 个答案:

答案 0 :(得分:2)

这对我来说听起来很合理。我肯定会继续构建CommandBuilder内部的ICommand实例:

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)
  { ... }
}

答案 1 :(得分:0)

是。我认为你把它覆盖得很好。