如何让类的属性仅对特定类可访问而不设为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
相关产品推荐
相关产品推荐

