我试图弄清楚实现特定 API 目标的正确语法是什么,但我在可见性方面苦苦挣扎。
我希望能够访问 Messenger
实例的成员,例如 msgr.Title.ForSuccesses
。
但是,我不希望能够从我的 Messenger
类之外实例化 Messenger.Titles
。
我也愿意将 Messenger.Titles 变成一个结构体。
我猜我需要某种工厂模式或其他东西,但我真的不知道该怎么做。
见下文:
class Program {
static void Main(string[] args) {
var m = new Messenger { Title = { ForErrors = "An unexpected error occurred ..." } }; // this should be allowed
var t = new Messenger.Titles(); // this should NOT be allowed
}
}
public class Messenger {
// I've tried making this private/protected/internal...
public class Titles {
public string ForSuccesses { get; set; }
public string ForNotifications { get; set; }
public string ForWarnings { get; set; }
public string ForErrors { get; set; }
// I've tried making this private/protected/internal as well...
public Titles() {}
}
public Titles Title { get; private set; }
public Messenger() {
Title = new Titles();
}
}
最佳答案
您只需要将 Titles 设为私有(private)并公开一个接口(interface)而不是它。
class Program {
static void Main(string[] args) {
var m = new Messenger { Title = { ForErrors = "An unexpected error occurred ..." } }; // this is allowed
var t = new Messenger.Titles(); // this is NOT allowed
}
}
public class Messenger {
public interface ITitles {
string ForSuccesses { get; set; }
string ForNotifications { get; set; }
string ForWarnings { get; set; }
string ForErrors { get; set; }
}
private class Titles : ITitles {
public string ForSuccesses { get; set; }
public string ForNotifications { get; set; }
public string ForWarnings { get; set; }
public string ForErrors { get; set; }
}
public ITitles Title { get; private set; }
public Messenger() {
Title = new Titles();
}
}
关于C# 嵌套类/结构可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6539225/