2013-10-05 133 views
0

我正在設計一個應該返回實例列表的方法,每個實例實際上是不同的數據類型。具有公共基類的不同類型的返回列表

以下是我的設計稿,我需要一個建議,因爲它

public class abstract Base 
{ 
    //DataType is an enum 
    public abstract DataType Type { get; set; } 

    public abstract BaseType Value { get; set; } 
} 

public abstract class BaseType 
{ 
}  

public class MyString:BaseType 
{ 
}  

public class MyInt:BaseType 
{ 
}  

//string for example  
public class Type1:Base 
{ 
    public override DataType Type 
    { 
     get { return DataType.Type1; } 
     set; 
    } 

    public override BaseType Value 
    { 
     get { return new MyString("a"); } 
     set; 
    } 
} 

public class Type2:Base 
{ 
    public override DataType Type 
    { 
     get { return DataType.Type2; } 
     set; 
    } 

    public override BaseType Value 
    { 
     //MyInt for example 
     get { return new MyInt(10); } 
     set; 
    } 
} 

方法應該是

List<Base> GetValues(); 

來電有望寫類似的東西

List<Base> values = GetValues(); 

foreach(var value in values) 
{ 
    switch(value.Type) 
    { 
     case DataType.MyString: 
      MyString str = value.Value as MyString; 
      break; 

     case DataType.MyInt: 
      MyInt str = value.Value as MyInt; 
      break; 
    } 
} 

我問題是什麼是最好的設計?我可以更好地使用泛型,如何?

+0

我看不出這一切會永遠工作......你可以給你所要完成什麼一些細節? – Yaur

+1

除非您願意使用'interface IBase ',並且如果您希望它包含混合實例,請將列表設置爲'List >',否則您無法真正做到這一點。當然接口只能爲'Value'指定一個getter。 – millimoose

+0

我不想使用對象,有沒有更好的方法,我可以在新的抽象類中使用泛型方法並覆蓋它嗎? –

回答

1

我會建議一個通用的基類:

public abstract class Base<T> 
    where T : BaseType 
{ 
    public abstract DataType Type { get; } 

    public abstract T Value { get; set; } 
} 

的Type1現在是:

public class Type1 : Base<MyString> 
{ 
    public override DataType Type 
    { 
     get { return DataType.MyString; } 
    } 

    public override MyString Value 
    { 
     get; 
     set; 
    } 
} 

不過,我不知道是什麼GetValues是。如果返回相同類型的值的列表,它也應該是通用的:

public List<Base<T>> GetValues<T>() 
    where T : BaseType 
{ 
    return theList; 
} 

如果返回不同類型的元素,你可以使用其他非通用基礎類:

public abstract class Base 
{ 
    public abstract DataType Type { get; } 
} 

public abstract class Base<T> : Base 
    where T : BaseType 
{ 
    public abstract T Value { get; set; } 
} 

GetValues方法將是:

public List<Base> GetValues() 
{ 
    return theList; 
} 

請注意,我將非泛型部分移入非泛型基類,以便您仍然可以使用DataType屬性。

您需要的值轉換爲相應的類型,以訪問Value屬性:

List<Base> values = GetValues(); 

foreach (Base value in values) 
{ 
    switch (value.DataType) 
    { 
     case DataType.MyString: 
      MyString myString = value as MyString; 
      ... 

     case DataType.MyInt: 
      MyInt myInt = value as MyInt; 
      ... 
    } 
} 

看來你只能使用DataType屬性來得到一個對象的類型信息。這不是必需的。您可以使用is操作:

foreach (Base value in values) 
{ 
    if (value is MyString) 
    { 
     MyString myString = value as MyString; 
     ... 
    } 
    else if (value is MyInt) 
    { 
     MyInt myInt = value as MyInt; 
     ... 
    } 
} 
+0

其實我在想第二個解決方案,非泛型基類 –

相關問題