2013-05-16 46 views
1

我正在嘗試改進一段代碼,但是我需要你的幫助。如何在C中創建類的列表#

基本上,我有2班TypeARecommendationFormTypeBRecommendationForm是從GenericRecommendationForm繼承和我想的對象oRecommendation複製一個新的對象。

爲此,我正在檢查類型以查看使用哪個類。

的問題是,有時我創建一個從GenericRecommendationForm繼承新的類,我必須要經過的所有代碼,看看報表裏添加這些,因爲我在幾個地方有他們。

我想要的是像一個類的列表,所以當我添加一個新的類時,我只需要將它添加到列表中。

有誰知道有辦法做到這一點?

下面是代碼:

GenericRecommendationForm oRecommendation= new GenericRecommendationForm(); 
... 
if (oRecommendation.GetType() == typeof(TypeARecommendationForm)) 
{ 
    recommendationForm = new TypeARecommendationForm((TypeARecommendationForm)oRecommendation); 
} 
if (oRecommendation.GetType() == typeof(TypeBRecommendationForm)) 
{ 
    recommendationForm = new TypeBRecommendationForm((TypeBRecommendationForm)oRecommendation); 
} 
else if (oRecommendation.GetType() == typeof(GenericRecommendationForm)) 
{ 
    recommendationForm = new GenericRecommendationForm(oRecommendation); 
} 

在此先感謝您的幫助。

+1

創建類型的列表清單''的 –

+1

線'GenericRecommendationForm oRecommendation =新GenericRecommendationForm();'總是會導致最後一個'else if'被執行。我假設該行僅用於說明目的,並不存在於真實代碼中? –

+1

http://dictionary.reference.com/browse/inherit – theyetiman

回答

4

實現此目的的最簡單方法是給您的GenericRecommendationForm虛擬Clone方法,所有派生形式都會覆蓋。

public class GenericRecommendationForm 
{ 
    // ... 

    public virtual GenericRecommendationForm Clone() 
    { 
     return new GenericRecommendationForm(this); 
    } 
} 

public class TypeARecommendationForm 
{ 
    // ... 

    public override GenericRecommendationForm Clone() 
    { 
     return new TypeARecommendationForm(this); 
    } 
} 

public class TypeBRecommendationForm 
{ 
    // ... 

    public override GenericRecommendationForm Clone() 
    { 
     return new TypeBRecommendationForm(this); 
    } 
} 
+0

非常感謝您的幫助。它工作完美! – diditexas

2

可以使用List<Type>來存儲你的類(以及類型的類實際上)。當你測試你的類的類型

List<Type> _classes = new List<Type>(); 
_classes.Add(typeof(YourClass)); 

然後:

當你需要添加另一個類,就用這個

foreach(Type t in _classes) 
{ 
    if (oRecommendation.GetType() == t) 
     recommendationForm = Activator.CreateInstance(t, new object[] { oRecommendation }); 
} 

但是,如果我是你,我會考慮以另一種方式實施它。

由於您似乎實際上克隆了基類的實例,只需將虛擬(或抽象)Clone方法添加到您的基類中,然後在派生類中添加所需的行爲。

這樣你就不必檢查類型可言的,可以這樣做:

oRecommendation.Clone() 
+0

你說得對,虛擬克隆()完美地工作。謝謝你的幫助。 – diditexas

+0

不用客氣;),因爲丹尼爾的答案是關於「克隆」方法更完整的,你應該將他的答案標記爲接受 – ppetrov