0

我有很多类,它们都有标准的 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);
            }

        }

    }


}
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

这与其说是一个答案,不如说是一个研究方向。我也在不可变类中苦苦挣扎

到目前为止,我正在使用我的构造函数来设置我的只读私有变量,我正在使用方法在内部更新我的列表,而不是将它们公开为公共属性:即。使用公共无效添加(字符串 itemToAdd)

我正在阅读 Petricek 和 Skeet 的一本书,名为“ Real World Functional Programming ”,它帮助我朝着您讨论的方向前进

这是同一作者的一个小教程,介绍了一些基本概念:http: //msdn.microsoft.com/en-us/library/hh297108.aspx

希望这个对你有帮助

更新:我可能应该更清楚:我希望为您指明一个更实用的视图的方向,而不是重写您在问题中列出的课程 - 我很抱歉(已删除示例)

于 2012-06-19T15:11:24.480 回答