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

时间:2013-05-28 15:47:39

标签: c#

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

例如,如果我有:

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>()

这可能吗?

3 个答案:

答案 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");
    }
}