假设我具有以下设置:
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
的构造函数中检查允许的“具体”类型 并在基类中实现默认的构造函数。还有另一种方法吗? (我发现使用基本构造函数并进行检查也很丑。)
答案 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
只能用这两种类型的参数构造。
第二种可能性是使构造函数private
或protected
并提供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
派生的类,则只需要该类型的方法。