是否可以将类型参数限制为抽象类的具体实现,如果这些实现没有默认构造函数?
例如,如果我有:
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>()
。
这可能吗?
答案 0 :(得分:11)
您可以添加new()
约束,这将要求该类不是抽象的并且具有默认构造函数。
答案 1 :(得分:10)
这是实现你所要求的一种方式。
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>();
}
}
任何维护此代码的人都可能会有点困惑,但它确实完全符合您的要求。
答案 2 :(得分:0)
public class ZooPen<T> where T : Animal
{
public ZooPen()
{
if (typeof(T).IsAbstract)
throw new ArgumentException(typeof(T).Name + " must be non abstract class");
}
}