我正在使用C#开发一个项目,我遇到了以下问题:
我有一些数据类型的类,例如Person类,它保存有关人的信息。
另外,我有一个DataManager类,负责管理程序中的人员。如果要添加,获取,查找或删除某个人,只能通过DataManager类执行此操作。
问题是我不希望除DataManager类之外的任何人能够改变Person对象。例如,如果某人调用DataManager.getPerson(int ID)
,他们将获得一个Person对象,并且能够使用该Person对象的setter函数来改变其内容(名字,姓氏,ID等)。
我想避免这种情况。我只希望DataManager类能够改变Person对象(通过诸如DataManager.changeFirstNameForPerson(int ID, string name)
之类的方法)。
什么是可以实现这一目标的最佳班级结构?
答案 0 :(得分:2)
好吧,你永远无法阻止人们100%改变价值观。他们总是可以经历反思。
但是,从API的角度来看,你可以将你的Person类的所有getter公之于众,并且所有setter都是内部的。只要Person和DataManager类在同一个程序集中,DataManager就能很好地访问setter,但其他引用程序集的应用程序却不能。
public class Person
{
public string Fname { get; internal set; }
}
public class DataManager
{
public void ChangeNameForPerson(int id, string fname)
{
Person p = Person.GetById(id);
// Inside the same assembly. Setter is accessible
p.Fname = fname;
}
}
在大会之外,你有这个:
Person p = DataManager.GetPerson(1);
p.Fname = "asdf"; // Compile time error
DataManager.ChangeNameForPerson(1, "asdf"); // Works fine
答案 1 :(得分:1)
首先想到的两件事是:
1 - 使Person属性设置器受到保护,并使DataManager派生自Person
2 - 将Person属性设置器设置为内部,并将Person和DataManager放在它们自己的程序集中
答案 2 :(得分:1)
如果使用internal关键字在Person类中声明get / set访问器,则只有同一程序集中的对象才能访问它们。只要在同一个程序集中包含DataManager类,它就可以访问,程序集外部的任何代码都不会。
答案 3 :(得分:0)
使Person
类不可变;也就是说,在其上创建所有字段readonly
并仅提供属性getter,而不是setter。将所有字段的值传递给构造函数。
答案 4 :(得分:-1)
一个选项是将现有的Person类重构为DataManager的内部类(即DataManager.Person),然后按以下方式创建一个新的Person类:
public class Person
{
private DataManager.Person person;
public Person(Datamanager.Person person)
{
this.person = person
}
public int ID
{
get { return person.ID; }
}
...
}
然后,在您的DataManager类中,您将执行以下操作:
public Person GetPerson(int id)
{
DataManager.Person person = // get the person by ID
return new Person(person);
}
现在外部代码可以访问只读Person类,但无法获得对读/写DataManager.Person的引用。