我有很多类,它们都有标准的 set 和 get 方法。我的问题是这些设置方法中的许多不应从包含对象的类外部调用。我不太确定是否有任何模式或 C# 缺少更好的词 - 可以使这更容易的操作。
参考下面的代码,有许多类似于 SecureSite 的类,控制器应该能够调用函数或访问变量来修改 SecureSite(以及其他类似的类)。但是,当用户要求查看 SecureSite 等时,他们应该无法更改此设置。
根据我有限的知识和我在本网站上看到的类似问题的答案,主要问题似乎是由于变量,Write_SecureSite 不能完全不可List<String> AccessHistory
变。所以,我想出的东西看起来像斗牛犬的背面一样丑陋,而且同样凌乱。本质上,有一个 SecureSite 类的写入版本,其中包含一个类,它返回 SecureSite 类的只读版本。
那么,我是否错过了 C# 中的一些魔法,这会使这一切变得如此简单?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ReadOnlyExample {
public class Write_SecureSite {
private List<String> mAccessHistory;
public List<String> AccessHistory {
get {
return mAccessHistory;
}
}
public SecureSite ReadOnly {
get {
return new SecureSite(this);
}
}
public class SecureSite {
public SecureSite(Write_SecureSite aParent) {
AccessHistory=aParent.AccessHistory;
}
public IEnumerable<String> AccessHistory;
}
}
public static class Controller {
private static Write_SecureSite SimpleSecureSite=new Write_SecureSite();
public static Write_SecureSite.SecureSite Login(String MyLogin) {
SimpleSecureSite.AccessHistory.Add(MyLogin);
return SimpleSecureSite.ReadOnly;
}
public static Write_SecureSite.SecureSite Details() {
return SimpleSecureSite.ReadOnly;
}
}
public static class User {
public static void Miscellaneous() {
Controller.Login("Me");
Write_SecureSite.SecureSite SecureSite=Controller.Details();
//Not going to happen.
SecureSite.AccessHistory.Add("Me2");
//No problem.
foreach(String AccessedBy in SecureSite.AccessHistory) {
Console.Out.WriteLine("Accessed By: "+AccessedBy);
}
}
}
}