添加类型参数约束以防止使用抽象类
本文关键字:抽象类 类型 参数约束 添加 | 更新日期: 2023-09-27 18:15:39
是否可以将类型参数限制为抽象类的具体实现,如果这些实现没有默认构造函数?
例如,如果我有:
public abstract class Animal
{
private Animal()
{
}
public Animal(string name)
{
// ...
}
// ...
}
public class Penguin : Animal
{
// ...
}
public class Chimpanzee : Animal
{
// ...
}
我还有下面的类:
public class ZooPen<T>
where T : Animal
{
// ...
}
我想允许new ZooPen<Penguin>()
和new ZooPen<Chimpanzee>()
,但我想禁止new ZooPen<Animal>()
。
这可能吗?
您可以添加new()
约束,这将要求类不是抽象的,并且具有默认构造函数。
这里有一个方法可以实现你的要求。
abstract class Animal
{
readonly string Name;
Animal() { }
public Animal(string name) { Name = name; }
}
abstract class Animal<T> : Animal where T : Animal<T>
{
public Animal(string name) : base(name) { }
}
class Penguin : Animal<Penguin>
{
public Penguin() : base("Penguin") { }
}
class Chimpanzee : Animal<Chimpanzee>
{
public Chimpanzee() : base("Chimpanzee") { }
}
class ZooPen<T> where T : Animal<T>
{
}
class Example
{
void Usage()
{
var penguins = new ZooPen<Penguin>();
var chimps = new ZooPen<Chimpanzee>();
//this line will not compile
//var animals = new ZooPen<Animal>();
}
}
维护这段代码的人可能会有点困惑,但它确实是您想要的。
public class ZooPen<T> where T : Animal
{
public ZooPen()
{
if (typeof(T).IsAbstract)
throw new ArgumentException(typeof(T).Name + " must be non abstract class");
}
}