添加类型参数约束以防止抽象类

是否可以将类型参数限制为抽象类的具体实现,如果这些实现没有默认构造函数?

例如,如果我有:

public abstract class Animal { private Animal() { } public Animal(string name) { // ... } // ... } public class Penguin : Animal { // ... } public class Chimpanzee : Animal { // ... } 

我也有以下课程:

 public class ZooPen where T : Animal { // ... } 

我想允许new ZooPen()new ZooPen() ,但我想禁止new ZooPen()

这可能吗?

这是实现您所要求的一种方式。

 abstract class Animal { readonly string Name; Animal() { } public Animal(string name) { Name = name; } } abstract class Animal : Animal where T : Animal { public Animal(string name) : base(name) { } } class Penguin : Animal { public Penguin() : base("Penguin") { } } class Chimpanzee : Animal { public Chimpanzee() : base("Chimpanzee") { } } class ZooPen where T : Animal { } class Example { void Usage() { var penguins = new ZooPen(); var chimps = new ZooPen(); //this line will not compile //var animals = new ZooPen(); } } 

任何维护此代码的人可能会有点困惑,但它完全符合您的要求。

您可以添加new()约束,这将要求该类不是抽象的并且具有默认构造函数。

 public class ZooPen where T : Animal { public ZooPen() { if (typeof(T).IsAbstract) throw new ArgumentException(typeof(T).Name + " must be non abstract class"); } }