2011-03-30 65 views
0

我有三個不同的對象,其作爲輸入來創建對象A.三種不同的對象有:C#根據不同的類型使用哪種模式來創建類型?

  • 的DataRow
  • 對象A(當我想創建一個副本)
  • 對象B(容貌像對象的,但不同的是,而不是一個亞型)

現在我有一個看起來像這樣的對象的靜態方法:

public class ObjectA 
{ 
    // class code 

    public static ObjectA CreateFromType(DataRow row) {/*implementation */} 
    public static ObjectA CreateFromType(ObjectA obj) {/*implementation */} 
    public static ObjectA CreateFromType(ObjectB obj) {/*implementation */} 
} 

這是一個好方法嗎?這是否違反OCP的代碼味道?你將如何實現這一點?

回答

3

爲什麼不提供適當的構造函數而不是工廠方法?有沒有第四個場景ObjectA可以「默認創建」?

作爲一種方法,構造函數具有明顯的優勢,因爲它們是當有人要創建一個時,它們是ObjectA的公共接口中最明顯的部分。如果要以您提到的某種方式創建實例的主要場景,我會強烈建議構造函數。

特別提到「克隆」構造函數:如果您的程序集中有其他可克隆的類,定義自己的IClonable派生以及定義明確的語義(淺層或深層克隆)和使用該方法而不是複製構造函數。

+0

我同意。創建重載的構造函數,每個接受不同的對象類型作爲參數。 – tobias86 2011-03-30 08:25:42

+0

多麼愚蠢,我從來沒有想過使用構造函數! – Martijn 2011-03-30 08:34:02

3

爲什麼不在ObjectA上創建不同的構造函數?或顯式或隱式運算符?你的情況我沒有看到需要靜態方法。

2

看起來不錯,但你也可以使用構造

public class ObjectA 
{ 
    // class code 

    public ObjectA(DataRow row) {/*implementation */} 
    public ObjectA(ObjectA obj) {/*implementation */} 
    public ObjectA(ObjectB obj) {/*implementation */} 
} 
0

ObjectA自行創建和初始化獨立?我傾向於讓你的構造函數沒有這個數據傳輸,而是創建對象方法來爲你的3種不同的場景初始化數據。

如果您希望從ObjectA繼承並專門進行數據傳輸,這也可以提高靈活性。

+0

是的,objectA可以自己創建('ObjectA obj = new ObjectA')。 – Martijn 2011-03-30 08:35:21