2010-09-01 68 views
3

我有很多T數組可讀。 每個T陣列可以表示類型A,B或C. A的數據:t的列表 B:單Ť C:究竟三顆T我應該繼承或使用枚舉嗎?

當我讀爲T陣列,我將能夠得到T的列表,並通過讀取列表中的第一個T來確定它是A,B或C類型。 我想到了兩種可能的方法,並希望知道它們的優缺點。

1)

enum {A, B, C}; 

class X { 
    enum dataType;//A, B or C 
    List<T> data;//just store all as list of T 
    //other essential methods/properties 
    //throws exception if an instance cannot fit into either A, B or C. 
    X(T[] input) 
    { 
     //read input 
    } 
} 

2)

abstract class X 
{ 
    abstract int length{get;} 
    //and other common essential methods/properties 
} 
class A : X 
{ 
    List<T> data; 
} 
class B : X 
{ 
    T data; 
} 
class C : X 
{ 
    T data1, data2, data3; 
} 
class ConcreteX: X 
{ 
    List<T> data; 
    ConcreteX(T[] input) 
    { 
     //reads input and stores T(s) into data 
    } 
} 
class XFactory 
{ 
    getX(T[] input) 
    { 
     ConcreteX conX = new ConcreteX(input); 
     //depending on whether it's A, B or C, create an instance of A, B, 
     //or C and map the corresponding fields from conX to the instance. 
     //return that instance 
    } 
} 
+0

如果可能的話,最好是讓代碼不關心類型。也就是說,讓每個類型都對一些抽象操作作出響應,然後對它們進行相同的操作。 – 2010-09-04 06:56:53

回答

0

好吧,如果你需要有泛型類只接受一系列特定類型的,那麼它可能會更容易內記錄接受類型數組。由於您尚未指定特定的語言,因此我將使用c#,但我無法保證可以使用其他語言。我想,如果語言有要檢查的類型

private static List<Type> _acceptedTypes = { typeof(Type1), typeof(Type2) ... } 

X(T[] input) 
{ 
    if(!_acceptedTypes.Contains(typeof(T))) 
    { 
     throw new SomeException(); 
    } 
    ... 
} 

雖然個人,這不是忠實地理想的能力,在運行時創建的類型的情況下,他們也應該有abilty,因爲它是一個運行時檢查(即你只有當你嘗試使用這個類時才知道它)。能夠以.net具有但只針對一種類型的通用方式應用約束會更好(這對您的情況沒有幫助)。

1

在OOP中,第二種方式更可接受。原因是,如果您要根據類型(A,B或C)添加行爲,則首先需要檢查枚舉值。在第二種情況下,您將具體行爲添加到具體類型A,B和C.如果您決定添加其他類型或刪除其中一個類型,則在第一種情況下,必須在第二種情況下更改類型檢查的所有類型情況下,變化只發生在一個地方。

+0

+1爲清晰的想法。我經歷了很多次這樣的事情,並且認識到,到處都要進行更改時,無處不在的枚舉和條件檢查會變得很痛苦。 我現在想知道的是這樣的: 如果我正在製作一個基於GUI的應用程序,並說我的顏色主題和字體隨着屏幕類型的變化而變。 理想情況下,我應該子類化屏幕對象,並在不同的子類中相應地設置不同的主題相關的字體和顏色? 或者我應該在所有屏幕上保留一個主題對象並傳遞正確的主題子類? – 2013-05-07 07:08:52