我问的是关于不可变对象模式的问题并实现它.我不是在谈论像.Net这样的.Net库中的现有类.
我知道不可变对象是一旦加载的对象,任何外部或内部组件都无法修改.如果我派生出不可变类,因为它不是密封类,该怎么办?然后将对象分配给基类,并调用基类中的方法.我已经有效地改变了基本不可变类的状态,因为它的状态是派生类对象的状态.
public class Person
{
private readonly string name;
public Person(string myName)
{
this.name = myName;
}
public string Name
{
get { return this.name; }
}
public void DisplayName()
{
Console.WriteLine(string.Format("Person's name is {0}", this.name));
}
}
public class AnotherPerson : Person
{
private string name1;
public AnotherPerson (string myName) : base(myName)
{
this.name1 = myName;
}
}
class Program
{
static void Main(string[] args)
{
Person me = new Prasanth("MyName");
me.DisplayName();
me = new AnotherPerson("AnotherName"); ;
me.DisplayName();
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
人名是MyName
人名是AnotherName
让我们忘记你的例子中的缺陷(评论已经说明了一切)并回答你的问题:"为什么不可变的类在C#中没有被封装."
问题是,不变性不是C#语言的一个特征.有些语言支持不可变性作为一个特性(在这种情况下,你的观点是有效的),但C#没有.最后,您只是使用现有的通用功能构建不可变类.因此,可能会产生限制.
此外,不变性是一种预防措施,而不是保护措施.关键是要防止任何人通过"正常"手段改变数据.如果有人真的想要更改数据,他们总是可以,例如通过反射(或如你所提到的子分类).但是如果一个开发人员这样做,那么他就不会忽视他那些应该是只读的变异数据,我们可以假设他有充分的理由这样做.不变性的目的是防止开发人员在不知不觉中将自己射入脚中,而不是将他锁定.
| 归档时间: |
|
| 查看次数: |
456 次 |
| 最近记录: |