C# - 通过公共属性显示私有嵌套类[关闭]

问题描述 投票:1回答:2

我有以下不编译的代码:

public class Outer
  {
    public Inner MyField = new Inner(); //error here: "field type is less accessible than field"
    private class Inner
    {
        public string Message = "Hello";
    }
  }

我必须能够像这样使用这个类:

var MyObject = new Outer();
Console.WriteLine(MyObject.MyField.Message); //should output "Hello"

“内部”必须只能在“外部”内实例化,所以不应该允许:

var MyObject = new Outer.Inner(); //I do not want users to be able to instantiate "Inner" directly
c# class static private public
2个回答
8
投票

解决这个问题的典型方法是通过一个接口:

public class Outer
{
    public IInner Inner = new Inner();
    public interface IInner { ... }

    private class Inner: IInner { ... }
}

IInner不需要嵌套,任何选择都是可行的。

这种模式的一个有趣变体是嵌套类继承自外部类。这是一个非常方便的代码结构,允许非常优雅的解决方案:

public abstract class Outer
{
     public static Outer GetOuter(...)
     {
         if (someConditionMet) return new InnerSpecialized1();
         return new InnerSpecialized2();
     } 

     private Outer() { ... } //avoids anyone extending Outer

     private class InnerSpecialized1: Outer { ... }
     private class InnerSpecialized2: Outer { ... }
}

2
投票

您只需要公开字段的getter并在类中构造实例:

public class Outer
{
    public Outer()
    {
        MyField = new MyField();
    }
    public Inner MyField {get; private set;}
}

public class Inner
{        
    internal Inner()
    {
    }
    public string Message = "Hello";
}
© www.soinside.com 2019 - 2024. All rights reserved.