0

私はかなりの数のクラスを持っており、それらは標準セットと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);
            }

        }

    }


}
4

2 に答える 2

1

インターフェイスを使用することをお勧めします:

public interface IReadSecureSite
{
  IEnumerable<String> AccessHistory { get; }
}

class Write_SecureSite : IReadSecureSite
{
    public IList<String> AccessHistoryList { get; private set; }

    public Write_SecureSite()
    {
        AccessHistoryList = new List<string>();
    }

    public IEnumerable<String> AccessHistory {
        get {
            return AccessHistoryList;
        }
    }
 }

 public class Controller
 {
    private Write_SecureSite sec= new Write_SecureSite();

    public IReadSecureSite Login(string user)
    {
       return sec;
     }

 }

 ...
 Controller ctrl = new Controller();
 IReadSecureSite read = ctrl.Login("me");
 foreach(string user in read.AccessHistory)
 {
 }
于 2012-06-19T15:23:26.597 に答える
0

これは、調査する方向というよりも、答えではありません。Immutable クラスにも苦労しています

これまでのところ、コンストラクターを使用して読み取り専用のプライベート変数を設定しています。リストをパブリック プロパティとして公開する代わりに、メソッドを使用してリストを内部的に更新しています。public Void Add(string itemToAdd) を使用

Petricek と Skeet による " Real World Functional Programming " という本を読んでいて、あなたが議論している方向に進むのに役立っています。

これは、いくつかの基本的な概念を紹介する同じ著者の小さなチュートリアルです: http://msdn.microsoft.com/en-us/library/hh297108.aspx

これが少し役立つことを願っています

更新:おそらくもっと明確にする必要がありました:質問にリストしたクラスを書き直すのではなく、より機能的なビューの方向に向けようとしていました-申し訳ありません(削除されたサンプル)

于 2012-06-19T15:11:24.480 に答える