C#中能否实现仅所属类可创建的公开返回类型?
实现仅指定类可创建的公开返回类型
针对你提出的需求——让返回类型公开可见,但仅Parent类能创建实例(同一程序集内其他类也无法创建),可以通过嵌套抽象类+私有密封子类的方式解决,完美规避原方案中接口被外部实现的问题。
具体实现代码
public class Parent { // 对外公开的抽象嵌套类,作为返回类型 public abstract class ChildHandle { // 仅允许内部子类访问的构造函数 protected ChildHandle() { } } // 私有密封子类,仅Parent可实例化 private sealed class Child : ChildHandle { } private int _count; public ChildHandle Create() { _count++; return new Child(); } public void Return(ChildHandle value) { // 可选:验证实例合法性,防止反射等非常规手段传入无效实例 if (value is not Child) throw new ArgumentException("仅接受Parent创建的实例"); _count--; } }
方案优势
- 公开可见性:
Parent.ChildHandle是public类型,外部代码可以正常接收、存储该类型的实例,完全满足对外暴露返回类型的需求。 - 严格的实例控制:
- 外部(包括同一程序集的其他类)无法直接实例化
ChildHandle,因为它是抽象类,且构造函数为protected,外部类无法访问。 - 外部类无法继承
ChildHandle,因为继承必须调用基类构造函数,而protected构造函数仅对Parent内部的子类开放。 - 唯一能创建
ChildHandle实例的Child类是private的,外部完全无法访问或实例化它。
- 外部(包括同一程序集的其他类)无法直接实例化
- 安全校验:在
Return方法中可以添加类型校验,进一步确保传入的实例确实由Parent创建,避免非常规手段绕过限制。
内容的提问来源于stack exchange,提问作者Darren Oakey
相关产品推荐
相关产品推荐

