A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© sunrise2 高级黑马   /  2014-7-19 17:00  /  1476 人查看  /  3 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 sunrise2 于 2014-7-19 17:01 编辑

                                                         面向对象三大特征之一-----封装       
         对于一个具有丰富结构化程序设计经验的程序员来说,面向对象的程序设计可能会给他们带来非常不自然的感觉。封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。被封装的对象通常被称为抽象数据类型
    封装的概念
      可以把程序按某种规则分成很多“块“,块与块之间可能会有联系,每个块都有一个可变部分和一个稳定的部分。我们需要把可变的部分和稳定的部分分离出来,将稳定的部分暴露给其他块,而将可变的部分隐藏起来,以便于随时可以让它修改。这项工作就是封装.
例如:在用类实现某个逻辑的时候,类就是以上所说的块,实现功能的具体代码就是可变的部分,而public的方法或者属性则是稳定的部分。
   封装的意义
        封装的意义在于保护或者防止代码(数据)被我们无意中破坏。在面向对象程序设计中数据被看作是一个中心的原素并且和使用它的函数结合的很密切,从而保护它不被其它的函数意外的修改。
       封装提供了一个有效的途径来保护数据不被意外的破坏。相比我们将数据(用域来实现)在程序中定义为公用的(public)我们将它们(fields)定义为私有的(privat)在很多方面会更好。
       私有的数据可以用两种方式来间接的控制。下面我们看一些c#例子来学习这两种方法用以封装数据。第一种方法,我们使用传统的存、取方法。第二种方法我们用属性(property)。无论我们使用哪种的方法,我们的目标是在使用数据的同时不能使它受到任何的破坏和改变。有如下好处

其一: 使用者只需要了解如何通过类的接口使用类,而不用关心类的内部数据结构和数据组织方法。
其二:高内聚,低耦合一直是我们所追求的,用好封装恰恰可以减少耦合
其三:只要对外接口不改变,可以任意修改内部实现,这个可以很好的应对变化
其四:类具有了简洁清晰的对外接口,降低了使用者的学习过程
用传统的读、写方法封装
     让我们来看一个例子有一个类Department,为了操纵这个类中的数据(string departname)我们定义了一个读方法和一个写方法。
  1. using system;
  2. public class Department
  3. {
  4. private string departname;
  5. // 读方法
  6. public string GetDepartname()
  7. {
  8. return departname;
  9. }

  10. //写方法
  11. public void SetDepartname( string a)
  12. {
  13. departname=a;
  14. }
  15. }
复制代码
通过上面的方法,我们可以保护私有数据不被外部程序所破坏。现在我们使用两个不同的方法来写和读数据
  1. public static int Main(string[] args)
  2. {
  3. Department d = new Department();
  4. d.SetDepartname("ELECTRONICS");
  5. Console.WriteLine("The Department is :"+d.GetDepartname());
  6. return 0;
  7. }
复制代码
在上面的例子中,我们不能直接访问类Department的实例d中的私有数据(string departname),我们只能通过这两个方法来访问。
      用属性来实现封装
        属性是c#引入的一种语言成分,只有很少的语言支持属性。通过对属性的读和写来保护类中的域。第一种方法体身也是一种好的方式,但用属性来实现封装会更方便。现在我们来看一个例子:
  1. using system;
  2. public class Department
  3. {
  4. private string departname;
  5. public string Departname
  6. {
  7. get
  8. {
  9. return departname;
  10. }
  11. set
  12. {
  13. departname=value;
  14. }
  15. }
  16. }
  17. public class Departmentmain
  18. {
  19. public static int Main(string[] args)
  20. {
  21. Department d= new Department();
  22. d.departname="Communication";
  23. Console.WriteLine("The Department is :{0}",d.Departname);
  24. return 0;
  25. }
  26. }
复制代码
       通过上面的例子,我们可以看到如何通过属性来实现封装。属性具有两种操作get和set。Get用来返回属性域的值。Set通过value这个变量来给属性域赋值。属性可以设为只读的(read-only)。这只需属性只具有一个set操作。另外在C#中有只读属性只写属性和既读既写属性。                                          

总结   
         封装是朝着面向对象程序设计迈出的第一步。本文向您展示了一些封装的知识。用传统的读、写两种方法可以实现封装,另一种实现封装的方法是使用属性。使用属性的好处在于对象的使用者可以用一条语句来操作内部的数据。





3 个回复

倒序浏览
封装、继承、多态,面向对象三大特征
回复 使用道具 举报
受教了:)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马