面向对象的三大特性:封装、继承、多态。
1.封装概念
封装:每个对象都包含有它能进行操作的所有信息,这个特性称为封装。这样的方法包含在类中,通过类的实例来实现。
2.封装的优点
A.良好的封装能够减少耦合(比如实现界面和逻辑分离)
B.可以让类对外接口不变,内部可以实现自由的修改
C.类具有清晰的对外接口,使用者只需调用,无需关心内部
D.因为封装的类功能相对独立,因此能更好的实现代码复用
E.可保护代码不被无意中破坏,通过私有字段等实现内部。注意:这里的代码保护不是指代码本身的加密,而是对不想外部更改的代码通过私有实现。
封装实例:我们单位养了一只价值800块钱,黄色的的牧羊犬,有陌生人来的时候,就会叫几声,当然越是陌生程度越高,叫的次数越多。对这样一个事务的处理上,可以利用面向对象的封装特性,代码实现如下:
1 /// <summary> 2 /// 狗狗类 3 /// </summary> 4 class Dog 5 { 6 string _dogName; 7 readonly Color _dogColor=Color.Yellow; 8 readonly double _dogPrice = 800.00; 9 int _shoutNumber; 10 11 /// <summary> 12 /// 构造函数 13 /// </summary> 14 /// <param name="dogName"></param> 15 public Dog(string dogName) 16 { 17 DogName = dogName; 18 } 19 20 /// <summary> 21 /// 狗狗名字 公有属性 22 /// </summary> 23 public string DogName 24 { 25 get { return _dogName; } 26 set { _dogName = value; } 27 } 28 /// <summary> 29 /// 狗狗颜色 只读属性 (颜色一出生就是这个颜色,这里只提供只读,当然这里不考虑染色) 30 /// </summary> 31 public Color DogColor 32 { 33 get { return _dogColor;} 34 } 35 /// <summary> 36 /// 狗狗价格 只读属性 (这是买来的价格,历史是不可以修改的) 37 /// </summary> 38 public double DogPrice 39 { 40 get { return _dogPrice; } 41 } 42 43 /// <summary> 44 /// 狗叫的次数 (不同的陌生人来,叫的次数不同) 45 /// </summary> 46 public int ShoutNumber{ 47 set{_shoutNumber=value;} 48 get { return _shoutNumber; } 49 } 50 51 /// <summary> 52 /// 狗叫的方法 53 /// </summary> 54 public void Shout() 55 { 56 int i=0; 57 string ShoutNum=""; 58 do 59 { 60 ShoutNum += "旺!"; 61 i++; 62 } while (i <= ShoutNumber); 63 MessageBox.Show(ShoutNum); 64 } 65 }
上面的Dog类就是对狗狗的全部信息,包括它的价格,颜色,叫声,名字等封装成一个类,以方便外部调用。对狗狗的价格和颜色使用了只读属性,因为它买来的历史价格和颜色是不可以更改的(染毛暂不考虑)。通过封装的思想我们可以增加狗狗体重等其它公有属性,而不会影响到外部接口的调用,对私有的只读属性做到了保护。
相信通过这两个实例,已经完全对封装熟悉了。假如我们的狗狗又生了一个宝宝,他的很多特征都基本相同,我们是不是又要复制一次这个类呢?这就要用到面向对象的另一个重要特性——继承,下面会慢慢介绍。
归纳一下封装的要点
要点:
1.封装,就是把一个对象所能操作的所有信息放在一起
2.封装能减少耦合,保持统一的对外接口,内部修改不影响外部调用