C# - 通过 public 属性 使私有嵌套 class 可见
C# - Make a private nested class visible through a public property
我有以下无法编译的代码:
public class Outer
{
public Inner MyField = new Inner(); //error here: "field type is less accessible than field"
private class Inner
{
public string Message = "Hello";
}
}
我必须能够像这样使用 class:
var MyObject = new Outer();
Console.WriteLine(MyObject.MyField.Message); //should output "Hello"
"Inner" 必须 ONLY 可以从 "Outer" 中实例化,所以这应该 NOT 被允许:
var MyObject = new Outer.Inner(); //I do not want users to be able to instantiate "Inner" directly
解决这个问题的典型方法是通过接口:
public class Outer
{
public IInner Inner = new Inner();
public interface IInner { ... }
private class Inner: IInner { ... }
}
IInner
无需嵌套,任意选择均可。
此模式的一个有趣变体是嵌套的 class 继承自外部 class。这是一个非常方便的代码结构,允许真正优雅的解决方案:
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 { ... }
}
您只需要公开字段的 getter 并在 class:
中构造实例
public class Outer
{
public Outer()
{
MyField = new MyField();
}
public Inner MyField {get; private set;}
}
public class Inner
{
internal Inner()
{
}
public string Message = "Hello";
}
我有以下无法编译的代码:
public class Outer
{
public Inner MyField = new Inner(); //error here: "field type is less accessible than field"
private class Inner
{
public string Message = "Hello";
}
}
我必须能够像这样使用 class:
var MyObject = new Outer();
Console.WriteLine(MyObject.MyField.Message); //should output "Hello"
"Inner" 必须 ONLY 可以从 "Outer" 中实例化,所以这应该 NOT 被允许:
var MyObject = new Outer.Inner(); //I do not want users to be able to instantiate "Inner" directly
解决这个问题的典型方法是通过接口:
public class Outer
{
public IInner Inner = new Inner();
public interface IInner { ... }
private class Inner: IInner { ... }
}
IInner
无需嵌套,任意选择均可。
此模式的一个有趣变体是嵌套的 class 继承自外部 class。这是一个非常方便的代码结构,允许真正优雅的解决方案:
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 { ... }
}
您只需要公开字段的 getter 并在 class:
中构造实例public class Outer
{
public Outer()
{
MyField = new MyField();
}
public Inner MyField {get; private set;}
}
public class Inner
{
internal Inner()
{
}
public string Message = "Hello";
}