You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET旧版本中如何确保实现类具备私有构造函数与静态工厂方法?

需求与现有方案问题

我需要一个简洁安全的方案来编写接口或抽象类,确保其实现类满足以下要求:

  • 拥有私有构造函数
  • 提供公开静态工厂方法
  • 场景不支持默认接口实现
  • 工厂方法的返回类型不能被窄化为接口或抽象类型

最小化工厂方法示例

public class ClassWithFactoryMethod
{
    private ClassWithFactoryMethod() { /* ... */ }
    public static ClassWithFactoryMethod CreateInstance() => new ClassWithFactoryMethod();
}

已尝试的方案及问题

使用接口的方案限制

若通过接口强制CreateInstance方法存在,会遇到以下问题:

  • 无法确保实现类的构造函数为私有,也无法约束CreateInstance是公开静态方法——接口方法不支持静态修饰,也不能指定访问权限
  • CreateInstance的实现必须返回接口类型实例,而非实现类自身的实例
  • CreateInstance无法定义为静态方法,因此接口无法保证类可通过公开静态工厂方法构造

对应的代码示例:

public interface IClassWithFactoryMethod 
{
    IClassWithFactoryMethod CreateInstance();
}

public class ClassWithFactoryMethod: IClassWithFactoryMethod
{
    private ClassWithFactoryMethod() { /* ... */ }
    public IClassWithFactoryMethod CreateInstance() => new ClassWithFactoryMethod();
}

使用抽象类的方案限制

抽象类对访问权限的控制略强,但仍存在类似的类型窄化问题:

  • 即便抽象类声明了受保护的构造函数,实现类的构造函数仍可能设置为更高的访问权限
  • 可以通过抽象类声明公开的CreateInstance来确保其公开性(实现类无法修改访问权限),但可重写方法在基类和实现类中都不能设为静态
  • 由于无法预知实现类的具体类型,CreateInstance必须返回抽象类类型的实例,和接口方案面临同样的类型窄化问题
  • 重写的工厂方法无法设为静态,因此抽象类也无法确保实现类存在公开静态工厂方法

对应的代码示例:

public abstract class ClassWithFactoryMethodBase
{
    protected ClassWithFactoryMethodBase() { }
    public abstract ClassWithFactoryMethodBase CreateInstance();
}

public class ClassWithFactoryMethod : ClassWithFactoryMethodBase
{
    private ClassWithFactoryMethod() { /* ... */ }
    public override ClassWithFactoryMethodBase CreateInstance() => new ClassWithFactoryMethod();
}

以上两种方案都无法确保工厂方法是公开且静态的,即便能满足访问权限要求,也会将工厂方法的返回类型窄化为不可实例化的接口或抽象类类型。


内容的提问来源于stack exchange,提问作者Josh Brunton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 05:12:28