今天看了java的封装性,突然就想到了C#的封装性,怎么样写代码才不违反封装性呢?
public class TestClass
{
public static void Main(string[] args)
{
Test t = new Test();
TestA d = t.D;
Console.WriteLine("t.D=" + t.D.Name);
Console.WriteLine("d=" + d.Name);
d.change("beeyon chen");
Console.WriteLine("change d value after....");
Console.WriteLine("t.D=" + t.D.Name);
Console.WriteLine("d=" + d.Name);
Console.ReadKey();
}
}
class Test
{
private TestA d;
public TestA D
{
get
{
return d;
}
}
public Test()
{
this.d = new TestA();
}
}
class TestA
{
private string name;
public string Name
{
get { return name; }
}
public TestA()
{
this.name = "beeyon";
}
public string change(string name)
{
this.name = name;
return this.name;
}
}
在Test中为了保护Test中的类对象 d ,我们只有设置了get 用来获取d
在main 方法中我们可以看到输出的内容为,红色中的t.D值也改变了,这样就破坏了封装性
t.D=beeyon
d=beeyon
change d value after....
t.D=beeyon chen
d=beeyon chen
因为d = t.D 引用了同一个对象,所以d改变了同一个对象的值.
如果TestA 实现了ICloneable 接口,那就有可以自己实现Clone一个新的对象
public class TestClass { public static void Main(string[] args) { Test t = new Test(); TestA d = t.D; Console.WriteLine("t.D=" + t.D.Name); Console.WriteLine("d=" + d.Name); d.change("beeyon chen"); Console.WriteLine("change d value after...."); Console.WriteLine("t.D=" + t.D.Name); Console.WriteLine("d=" + d.Name); Console.ReadKey(); } } class Test { private TestA d; public TestA D { get { return (TestA)d.Clone(); } } public Test() { this.d = new TestA(); } } class TestA : ICloneable { private string name; public string Name { get { return name; } } public TestA() { this.name = "beeyon"; } public string change(string name) { this.name = name; return this.name; } #region ICloneable 成员 public object Clone() { TestA a = (TestA)this.MemberwiseClone(); return a; } #endregion }
输出的内容
t.D=beeyon
d=beeyon
change d value after...
t.D=beeyon
d=beeyon chen