比方说,我有一个基类命名Animal
和两个派生类命名Lion
和Tiger
。而且我也想有一个通用类型,名为AnimalList<Animal>
来包含的成员Animal
。例如:
var list = new AnimalList<Animal>();
list.Add(new Lion());
list.Add(new Tiger());
到目前为止非常简单,但是有一个问题……我希望基类Animal
成为abstract
。也就是说,我不想允许创建基类的实例。但是,使基类抽象化不会令人惊讶地导致错误CS0310(请参见下面的完整示例)。
我确实提出了一个解决方案:根据需要使基类成为非抽象类,并仅从默认(无参数)构造函数中引发异常:
public Animal()
{
throw new System.NotImplementedException();
}
但是,这让我感到有些不安。有没有更好的办法?
这是一个完整的示例,说明了我上面描述的场景:
// public class Animal {} // OK
public abstract class Animal {} // 'abstract' keyword causes error 'CS0310'
public class Lion : Animal {}
public class Tiger : Animal {}
public class AnimalList<T> :
Animal
where T : Animal, new()
{
public void Add(T animal) {}
}
class AnimalListDemo
{
static public void Main(string[] args)
{
// The following statement causes:
// error CS0310 - 'Animal' must be a non-abstract type with a
// public parameterless constructor in order to use it as
// parameter 'T' in the generic type or method 'AnimalList<T>'
var list = new AnimalList<Animal>();
list.Add(new Lion());
list.Add(new Tiger());
}
}
只需删除new()
约束。它要求您提供一个可以实例化的类new()
(这就是要求的全部内容),但是抽象类显然不能做到这一点。
从MSDN:
新约束指定通用类声明中的任何类型参数都必须具有公共的无参数构造函数。要使用新的约束,类型不能为abstract。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句