私はかなりの数のクラスを持っており、それらは標準セットとgetメソッドを持っています。私の問題は、これらのsetメソッドの多くが、オブジェクトを保持するクラスの外部から呼び出せないようにする必要があることです。より良い単語がないためのパターンや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);
}
}
}
}