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

如何阻止直接实例化C#/.NET7类,仅允许通过CreateInstance方法?

解决方案

方案1:使用internal构造函数(同程序集场景)

如果基类UserFeedback和子类A、B在同一个程序集里,把子类的构造函数设为internal即可。这样外部代码无法直接实例化子类,但同程序集的基类静态方法可以正常调用构造函数,同时抽象基类本身也无法被直接实例化。

示例代码:

public abstract class UserFeedback
{
    public static UserFeedback CreateInstance(string type)
    {
        return type switch
        {
            "A" => new A(),
            "B" => new B(),
            _ => throw new ArgumentException("Invalid type")
        };
    }
}

internal class A : UserFeedback
{
    internal A() { } // internal构造,同程序集可访问
}

internal class B : UserFeedback
{
    internal B() { }
}

方案2:嵌套子类(跨程序集也适用)

把A、B作为UserFeedback的嵌套私有/内部类,这样子类的构造函数可以设为private,基类的静态方法完全有权限调用,外部代码既不能实例化基类,也无法直接访问嵌套的子类。

示例代码:

public abstract class UserFeedback
{
    public static UserFeedback CreateInstance(string type)
    {
        return type switch
        {
            "A" => new A(),
            "B" => new B(),
            _ => throw new ArgumentException("Invalid type")
        };
    }

    private class A : UserFeedback
    {
        private A() { } // 私有构造,只有外部类能访问
    }

    private class B : UserFeedback
    {
        private B() { }
    }
}

方案3:接口+internal构造(隐藏实现细节)

定义公开的IUserFeedback接口,让UserFeedback实现该接口,子类构造设为internal,基类静态方法返回接口实例。外部代码只能拿到接口对象,完全看不到具体的子类和基类的构造细节。

示例代码:

public interface IUserFeedback
{
    // 定义公共方法
}

public abstract class UserFeedback : IUserFeedback
{
    public static IUserFeedback CreateInstance(string type)
    {
        return type switch
        {
            "A" => new A(),
            "B" => new B(),
            _ => throw new ArgumentException("Invalid type")
        };
    }
}

internal class A : UserFeedback
{
    internal A() { }
}

internal class B : UserFeedback
{
    internal B() { }
}

不需要把构造设为public的原因

以上三种方案都能避免将子类构造设为public,同时满足:

  • 阻止外部直接实例化UserFeedback(抽象类本身就无法实例化)
  • 基类静态方法能正常创建子类实例
  • 外部无法直接实例化子类

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 03:35:13