2012-03-29 86 views
1

我必須執行一些操作。他們每個人都有一些共同的元素,所以他們應該從一個類繼承。可以說,他們是做一些網絡行爲,所以基類是如何處理繼承類的區別?

public class WebAction 
{ 
    private ServerData _serverData; 
    public WebAction(ServerData serverData) 
    { 
     _serverData = serverData; 
    } 
} 

而且,每個這個動作需要被執行,因此在基類中我也應該有某種Execute()方法。問題是,這個對象的每一個做了一點點不同的事情,所以它應該採取不同的參數。我的問題是 - 女巫的方式是最好的達到這個?

起初我在想一些配置對象,e,g。 Execute(IWebActionConfig config)。在這種情況下,我可以像使用對象:

LoginWebAction loginWebAction = LoginWebAction(staticServerConfig); 
LoginWebActionConfig = new LoginWebActionConfig { someData = "foo" }; 
loginWebAction.Execute(loginWebActionConfig); 

但是它有什麼意義來創建對象的一個​​額外的樹?也許會更好地配置屬性的每個孩子的WebAction?

LoginWebAction loginWebAction = LoginWebAction(staticServerConfig); 
loginWebAction.someData = "foo"; 
// Execute will throw exception when someData not set 
loginWebAction.Execute(); 

有了這些(如果有的話)方式更好嗎?

回答

0

它可以做更多的OOP風格。 look at NVI pattern

public class WebAction 
{ 
    private ServerData _serverData; 
    public WebAction(ServerData serverData) 
    { 
    _serverData = serverData; 
    } 
    public virtual ExecuteAction{}; 
    public Execute() 
    { 
    ExecuteAction(); 
    //to do the rest of base code 

    } 
} 
public class WebActionDerived1: WebAction 
{ 
    WebActionDerived1(ServerData serverData, object arg1/*any unique param*/) 
    :base(serverData) 
    { 
     _my_arg1 = arg1; 
    } 
    public override ExecuteAction 
    { 
    //call any procedure with your _my_arg1; 
    } 
} 
public class WebActionDerived2: WebAction 
{ 
    WebActionDerived1(ServerData serverData, string arg1, 
    string arg2/*otherunique param*/) 
    :base(serverData) 
    { 
     _my_arg1 = arg1; 
     _my_arg2 = arg2; 
    } 
    public override ExecuteAction 
    { 
    //call any procedure with your _my_arg1, and _my_arg2; 
    } 
} 
1

我想你可能會在這裏使用Command Pattern。 您可以爲封裝您的「操作」創建不同的命令(每個網絡操作的一個命令),並且每個命令都將具有所需的所有參數。

命令處理程序將包含執行該命令的「邏輯」。有關命令模式,在

更多信息:

http://www.codeguru.com/csharp/.net/net_general/patterns/article.php/c15663/Implement-a-Command-Pattern-Using-C.htm

http://danielshitrit.blogspot.co.uk/2011/11/best-practices-command-pattern-in-c.html

1

由於每個動作採用不同的參數你是不是真的要能夠使用多態來調用它們。換句話說,在你的類上調用Execute的方法將不得不知道它將要調用Execute的類的確切類型。

所以,我會質疑在這裏使用繼承是否真的是正確的解決方案。

您聲明您正在使用繼承,因爲每個類都有一些共享代碼。這通常不足以使用繼承。我會認爲它是一種反模式。

使用繼承的問題是您將基類與派生類緊密耦合。這可能會導致單元測試和將來的維護問題。

我建議值得創建一個包含共享功能的獨立類。然後將包含此類的Action類作爲成員並根據需要進行調用。這將允許你爲測試目的而模擬這個基類。然後,每個類都可以擁有自己的Execute方法,每個方法都具有所需的參數。