如何阻止直接实例化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
相关产品推荐
相关产品推荐

