2012-12-20 71 views
2

我还没有找到我的用例在现有的问题,所以我在这里。 我有了泛型这样一个抽象类:抽象的泛型和摘要列表

public abstract class aParameter<T> 
{ 
    private T _parameter; 

    public T Parameter 
    { 
     get { return _parameter;} 
    } 

    ... 
} 

然后,我有我的“类型”类像这样:

public class IntParameter : aParameter<Int32> 
{ 
    public IntParameter(Int32 value) 
    { 
     _parameter = value; 
    } 
} 

public class TextParameter : aParameter<String> 
{ 
    public TextParameter(String value) 
    { 
     _parameter = value; 
    } 
} 

现在在我的应用程序代码中,我想创建一个字典与抽象泛型类没有指定泛型类型。就像这样:

... 
private Dictionary<Int32, aParameter> _paramDict = new Dictionary<Int32, aParameter>(); 
... 

在以前的版本中,我使用的接口,而不是抽象类aParameter但我想将其迁移到抽象,这样我可以简化我的“类型”类,而不是重复相同的代码为每个“类型”。

这里有什么想法吗?

编辑

我忘了提,这将是是指公司之间分配,所以我真的需要,以确保允许的类型库的一部分。我不能让objects进入我的代码。

回答

5

您可能仍然需要非泛型接口(或非Brandon所说的非泛型抽象基类),除非您放弃使用对象。

的原因是,aParameter<String>是不一样的类型aParameter<int32>所以你不能让他们进入一个字典没有一些帮助。

我的首选方法是声明一个非泛型接口并将其用作字典的基础,然后在每个类型化的泛型中以及抽象基类中实现它。这样,您可以尽可能从基类继承,或者如果您的类型之一需要从其他类继承,那么只需实现接口 - 您将获得最大的灵活性。

+0

接口方法看起来像我的选择。我仍然遇到了一个问题,因为我需要接口提供的'public T Parameter'。我试着把它作为'公共对象参数',但不能覆盖输出类型。我去看看,如果我可以用'object'输出 –

+0

走这条路好做它用'object'返回类型为我的'Parameter'属性和结果都很好。现在完成清理代码... –

+0

您可以使用参数返回类型的接口返回对象,但在泛型中仍然具有更强的类型。 –

4

制作一个非通用的抽象基类,让您的通用抽象类继承它。

+0

不错,但我更喜欢Jon的'interface'方法。 –

+0

是的,乔恩给了你两全其美的:) –

0

泛型类型的目的是(除其他外),您只能编写一次代码,可用于多种类型。但是,由于C#是强类型的,编译器需要知道它在泛型类中处理的是什么类型。这就是为什么你必须指定通用类型(即角括号中的类型) 如果你没有指定通用类型,那么在你的例子中,编译器不会知道Parameter属性的类型。

取决于你用它做什么,有一些可能的方法:

  1. 使用Dictionary<int, object>。 读取值时,可以使用一堆if/elses来检查对象的特定类型并将其转换为适当的类型。例如

    如果(obj.GetType()== typeof运算(TextParameter)){ TextParameter P = OBJ时TextParameter //做的东西 } 否则如果obj。的GetType()== typeof运算(IntParameter)){ IntParameter P = OBJ时IntParameter //做的东西 }

  2. 有多个词典。 Dictionary<int, TextParameter>Dictionary<int, IntParameter>

  3. 如果有方法/在aParameter性质不是类型依赖然后将它们移动到一个较低的水平非通用抽象类。这可以为您提供至少一些功能,而无需诉诸类型转换。

+0

我不能为你的选择1作为'对象'过于通用,我不想要if/else垃圾。你的选项2是不可能的,因为我不知道什么是馈送到我的代码。你的选择3可能是最好的选择,我不得不弄清楚,但是我厌倦了像地狱一样的投射。 –