抽象泛型和抽象列表
本文关键字:抽象 列表 泛型 | 更新日期: 2023-09-27 17:49:01
我没有在现有的问题中找到我的用例,所以我开始了。我有一个抽象类,它有这样的泛型:
public abstract class aParameter<T>
{
private T _parameter;
public T Parameter
{
get { return _parameter;}
}
...
}
然后我有我的"Type"类,像这样:
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
被输入到我的代码中
您可能仍然需要非泛型接口(或者如Brandon所说的非泛型抽象基类),除非您转而使用对象。
原因是aParameter<String>
和aParameter<int32>
不是同一种类型,所以如果没有帮助,您将无法将它们放入同一个字典中。
我的首选方法是声明一个非泛型接口,并将其用作字典的基础,然后在每个类型化泛型和抽象基类中实现它。这样,您可以在可能的情况下从基类继承,或者在您的一个类型需要从其他类型继承时仅实现接口—您获得了最大的灵活性。
创建一个非泛型抽象基类,并从它继承你的泛型抽象类
泛型类型的目的是(除其他外)您只能编写一次可用于多种类型的代码。然而,由于c#是强类型,编译器需要知道它在泛型类中处理的是什么类型。这就是为什么你必须指定泛型的类型(即尖括号中的类型)。如果你不指定泛型的类型,那么在你的例子中,编译器将不知道Parameter属性的类型。
根据您对它的具体操作,有许多可能的方法:
-
使用
Dictionary<int, object>
。在读取值时,您可以使用一堆if/else来检查对象的特定类型并转换为适当的类型。例如if(obj.GetType() == typeof(TextParameter)){TextParameter p = obj as TextParameter//做点什么}如果obj.GetType() == typeof(IntParameter)){IntParameter p = obj as IntParameter//做点什么}
-
拥有多个字典。
Dictionary<int, TextParameter>
,Dictionary<int, IntParameter>
等 -
如果参数中有不依赖于类型的方法/属性,那么将它们移动到较低级别的非泛型抽象类中。这至少可以为您提供一些功能,而不必诉诸类型转换。