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

如何让类的属性仅对特定类可访问而不设为public?

解决方案:让LinkStack安全访问StackElement的below属性

针对你的需求,这里提供几种实用的方案,按安全性和封装性从高到低排序:

方案一:将StackElement设为LinkStack的私有嵌套类

这是最安全的做法,直接把StackElement嵌套在LinkStack内部并标记为private,这样只有LinkStack能访问它的所有成员,外部类完全看不到StackElement,彻底避免了其他类随意修改below的风险。

代码示例:

public class LinkStack
{
    // 私有嵌套类,仅LinkStack可访问
    private class StackElement
    {
        public int value;
        // below可以设为private,只有LinkStack能访问
        private StackElement below;
    }

    private StackElement topElement;
    private int count, capacity;

    public void Pop()
    {
        // 直接访问private的below,完全没问题
        topElement = topElement.below;
    }
}

方案二:使用internal修饰符(仅限同一程序集场景)

如果StackElement需要被同一程序集内的其他类使用,但不想让外部程序集访问below,可以把below标记为internal。这样同一程序集里的类(包括LinkStack)能访问below,外部程序集则不行。

代码示例:

public class StackElement
{
    public int value;
    // 同一程序集内可访问,外部程序集不可见
    internal StackElement below;
}

public class LinkStack
{
    private StackElement topElement;
    private int count, capacity;

    public void Pop()
    {
        topElement = topElement.below;
    }
}

方案三:通过内部接口封装访问逻辑(适合需要暴露StackElement的场景)

如果必须让StackElement对外可见,但要限制below的访问,可以给StackElement定义一个内部接口,让LinkStack通过接口访问below,同时将below设为private。

代码示例:

// 内部接口,仅同一程序集可访问
internal interface IStackElementInternal
{
    StackElement Below { get; }
}

public class StackElement : IStackElementInternal
{
    public int value;
    private StackElement below;

    // 实现内部接口,仅同一程序集能通过接口获取below
    StackElement IStackElementInternal.Below => below;
}

public class LinkStack
{
    private StackElement topElement;
    private int count, capacity;

    public void Pop()
    {
        // 通过内部接口访问below
        topElement = ((IStackElementInternal)topElement).Below;
    }
}

这个方案既保留了StackElement的公共可见性,又只允许同一程序集内的LinkStack访问below,安全性介于前两者之间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 00:05:22