2008-12-12 43 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方法需要輸出中一個字符串,它看起來財產以後這樣的:

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,並且不必擔心執行任何如果statings或空檢查。

請問這是正確的方法嗎?

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對象? – 2008-12-12 04:01:32