C# 的封装性

今天看了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



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值