调用基本构造函数的约束

时间:2019-03-21 13:53:23

标签: c#

假设我具有以下设置:

public abstract class A
{
    B b_ {get; set;} // where B is some abstract class

    public A(B b)
    {
        b_ = b;
    }
}

public class D : A
{
    // some new fields
    D(B b) : base(b)
    {

    }
}

其中B是一些抽象类,可从中抽象出各种“具体”类型。

D的构造函数中,我想对b的运行时类型施加约束,例如仅允许某些类型。为此,我可以删除对基类构造函数的调用,在D的构造函数中检查允许的“具体”类型 并在基类中实现默认的构造函数。还有另一种方法吗? (我发现使用基本构造函数并进行检查也很丑。)

1 个答案:

答案 0 :(得分:4)

一种解决方案是仅声明允许类型的构造函数。
假设您有从B派生的这些类:

public class DeriveFromB1 : B {}
public class DeriveFromB2 : B {}

然后您可以在D中添加两个构造函数:

public class D : A
{
    D(DerivedFromB1 b) : base(b)
    {
    }
    D(DerivedFromB2 b) : base(b)
    {
    }
}

现在D只能用这两种类型的参数构造。


第二种可能性是使构造函数privateprotected并提供static工厂方法:

public class D : A
{
    private D(B b) : base(b)
    {
    }

    public static D Get(DerivedFromB1 b) => new D(b);
    public static D Get(DerivedFromB2 b) => new D(b);
}

在两种情况下,您都必须为每种类型实现方法。如果所有相关类型都继承自同一个B派生的类,则只需要该类型的方法。