2013-05-20 88 views
2

現在我有一個包裝類,它包含大約10種方法,其中8種方法爲ClassA提供了功能& 2種方法爲ClassB提供了功能,因此我計劃在包裝類構造函數中實例化ClassA和ClassB以以適當的方法使用它們。C#類設計問題

這個設計很好還是我錯過了什麼?我知道這種方法的一個缺點是,如果用戶傳遞錯誤的構造函數參數並使用錯誤的方法,調用應用程序將收到異常。

見樣品如​​下代碼:

Public class Wrapper 
{ 
ClassA _a = null; 
ClassB _b = null; 

public Wrapper(bool createClassA) 
{ 
    if (createClassA) 
    { 
    _a = new ClassA(); 
    } 
    else 
    { 
    _b = new ClassB(); 
    } 
} 

public string Method1() 
{ 
    return _a.ReturnSomething(); 
} 

//similarly Method2 to Method8 calls _a class methods. 

public void Method9() 
{ 
    return _b.DoSomething(); 
} 

public string Method10() 
{ 
    return _b.ReturnTestMessage(); 
} 
} 

預先感謝。

+5

是什麼在cstor中進行條件初始化的要點? –

+2

這......看起來不對。你知道如何使用接口嗎? –

+1

沒有這個設計是不好的.....你爲什麼這樣做? –

回答

5

您有兩個類不調用任何常用函數。把它們放在一個包裝類中沒有什麼意義,因爲這兩個類完全不同。

如果這些類在概念上是聯繫在一起的(你可以將這些類放在一起),那麼也許把它們放在一個名字空間中會更有意義?

namespace YourNamespace 
{ 
    class ClassA 
    { 
     // ... 
    } 

    class ClassB 
    { 
     // ... 
    } 
} 
+0

是的,類A和B在同一個命名空間中。你能否清楚地告訴我我需要什麼? – user972255

2

你包裹兩類在一起的方式是罰款(ISH),但是你的方式使人們有條件的,只有類1被實例化也不行。包裝類應該是透明可用的。這意味着您可以在不知道A或B或其構造方式的情況下調用封裝類的任何方法。

如果A類和B類是不同的,那麼我會懷疑你是否需要包裝它們。除非你的包裝類是某種外觀或適配器。

+0

是的,類A和類B是不同的,但客戶端應用程序已經引用了一個接口(之前指的是類A),但現在我們還想添加類B的功能。 – user972255

+0

我不明白的是爲什麼你不讓他們自己創建類?你把它放在它們上面來傳遞一個布爾值使得包裝器中的任何一個類成爲可能? –

0

這是非常通用的代碼,所以很難給你提供建議。你覺得這個包裝爲你的用戶帶來了什麼樣的好處?

關於使用錯誤構造方法的一個具體問題可以通過存儲createClassA並檢查您的方法來解決,或者通過在每個method_X_方法中針對null檢查_b或_a來解決。

或者,它可能是更好的爲您的包裝明確拋出異常,如果調用者調用「不正確」包裝方法,而不是什麼都沒有返回,或者爲null,或空字符串(等)