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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 14:35:18