如何让抽象父类访问容器类的私有成员且不暴露私有嵌套类?
如何让抽象父类访问容器类的私有成员且不暴露私有嵌套类?
嘿,这个问题我之前也纠结过,刚好有个很优雅的解决办法——利用C#的显式接口实现+私有嵌套接口,既能让父类拿到需要的成员,又完全不会暴露给子类!
先理清楚你的核心诉求:
- 私有嵌套类
PrivateThing绝对不能暴露给派生类 ThingContainer作为给派生类的操作入口,只能开放指定方法(比如AddThing)- 父类
ParentClass需要访问ThingContainer里的Things集合,但不能让派生类看到这个集合
具体实现步骤如下:
- 在
ParentClass内部定义一个私有嵌套接口,把父类需要访问的成员声明在里面 - 让
ThingContainer显式实现这个私有接口 - 父类在需要访问
Things时,将ThingContainer实例转换为这个私有接口来调用成员
修改后的完整代码如下:
public abstract class ParentClass { // 新增私有嵌套接口,仅父类可见 private interface IThingContainerInternal { IReadOnlyList<PrivateThing> Things { get; } } private sealed class PrivateThing { } protected sealed class ThingContainer : IThingContainerInternal { private List<PrivateThing> _things = new(); // 显式实现私有接口,派生类无法访问这个成员 IReadOnlyList<PrivateThing> IThingContainerInternal.Things => _things; public void AddThing() { _things.Add(new PrivateThing()); } } private readonly List<ThingContainer> _thingContainers = new(); protected void Setup(Action<ThingContainer> setupThings) { var container = new ThingContainer(); setupThings(container); _thingContainers.Add(container); } public void ProcessThings() { // 通过私有接口访问Things,派生类完全看不到这个逻辑 foreach (var thing in _thingContainers.SelectMany(static b => ((IThingContainerInternal)b).Things)) Console.WriteLine(thing.ToString()); } } public sealed class DerivedClass : ParentClass { public DerivedClass() { Setup(static things => { things.AddThing(); // 只能调用公开的AddThing方法,看不到Things集合 // things.Things 这里会编译报错,完美符合需求 }); } }
这个方案的优势在于:
- 私有接口
IThingContainerInternal仅在ParentClass内部可见,派生类完全感知不到它的存在 - 显式实现的接口成员不会成为
ThingContainer的公共/受保护成员,派生类无法访问 PrivateThing始终保持私有,完全不会泄露给外部
备注:内容来源于stack exchange,提问作者user21691167
相关产品推荐
相关产品推荐

