Din*_*ino 3 .net c# oop generics
正如标题所示,我想做以下,但编译器不会让我:
public class MyClass
{
private List<SomeSupertype> myList;
public MyClass<T> (ICollection<T> elements) where T : SomeSupertype
{
myList = new List<SomeSuperType> ();
foreach (SomeSupertype element in elements) {
myList.Add (element);
}
}
}
Run Code Online (Sandbox Code Playgroud)
不知何故,似乎不可能将泛型参数添加到本身不是通用的类的构造函数中.请注意,MyClass应该是非泛型类型,因为客户端在构造后不必区分不同类型的MyClass.
任何人都可以帮我解决这个问题吗?这有可能吗?它肯定是在Java :)
编辑:我忘了提到我使用的是.NET 3.5,因此不支持协变泛型.
您可以使用工厂模式来解决您的问题:
public class MyClass
{
private List<SomeSuperType> myList = new List<SomeSuperType>();
public static MyClass MyClassBuilder<T>(ICollection<T> elements) where T : SomeSuperType
{
var myClass = new MyClass();
foreach (SomeSuperType element in elements)
{
myClass.myList.Add(element);
}
return myClass;
}
protected MyClass()
{
}
}
Run Code Online (Sandbox Code Playgroud)
或者您可以创建两个类,如下所示:
// Put all the methods here
public class MyClass
{
protected List<SomeSuperType> myList = new List<SomeSuperType>();
protected MyClass()
{
}
}
// This class will define only the generic constructor
public class MyClass<T> : MyClass where T : SomeSuperType
{
public MyClass(ICollection<T> elements)
{
foreach (SomeSuperType element in elements)
{
myList.Add(element);
}
}
}
Run Code Online (Sandbox Code Playgroud)
(这忽略了这样一个事实,就像Anton
在C#> = 4.0中所写的那样,你可以简单地接受IEnumerable<SomeSuperType>
并且开心)
C#中的构造函数不能是通用的(同上事件,属性,析构函数,运算符).请考虑创建一个静态通用工厂方法:
public class MyClass
{
private List<SomeSupertype> myList;
private MyClass(List<SomeSupertype> myList)
{
this.myList = myList;
}
public static MyClass Create<T>(ICollection<T> elements)
where T : SomeSupertype
{
var myList = new List<SomeSuperType>(elements);
foreach (SomeSupertype element in elements)
{
myList.Add(element);
}
return new MyClass(myList);
}
}
Run Code Online (Sandbox Code Playgroud)
即使在.NET 3.5中,您也可以使用LINQ使列表创建更简单:
var myList = elements.Cast<SomeSuperType>().ToList();
Run Code Online (Sandbox Code Playgroud)