通过上面的方法,我们可以保护私有数据不被外部程序所破坏。现在我们使用两个不同的方法来写和读数据
在上面的例子中,我们不能直接访问类Department的实例d中的私有数据(string departname),我们只能通过这两个方法来访问。
用属性来实现封装
属性是c#引入的一种语言成分,只有很少的语言支持属性。通过对属性的读和写来保护类中的域。第一种方法体身也是一种好的方式,但用属性来实现封装会更方便。
现在我们来看一个例子:
通过上面的例子,我们可以看到如何通过属性来实现封装。属性具有两种操作get和set。Get用来返回属性域的值。Set通过value这个变量来给属性域赋值。属性可以设为只读的(read-only)。这只需属性只具有一个set操作。
只读属性
using system; public class Department ... {private string departname;public string Departname...{get...{return departname;}set ...{departname=value;}}} public class Departmentmain ... {public static int Main(string[] args)...{Department d= new Department();d.departname="Communication";Console.WriteLine("The Department is :{0}",d.Departname);return 0;} }using system;public class ReadDepartment {private string departname;public ReadDepartment(string avalue){departname=avalue;}public string Departname{get{return departname;}}}public class ReadDepartmain{public static int Main(string[] args){ReadDepartment d= new ReadDepartment("COMPUTERSCIENCE");Console.WriteLine("The Department is: {0}",d.Departname);return 0;} }
在上面的例子中我们看到了如何来实现一个只读的属性。类ReadDepartment拥有一个Departname属性只实现了get操作。它省略了写操作。这个特别的类拥有一个构造器,用来接受一个字符串变量。类ReadDepartmain中的Main方法创建了一个新的对象d。对像d的实例使用了类ReadDepartment带有一个字符串参数的构造器。因为上面的属性是只读的,所以我们不给给域departname赋值并且我们只侧读取此域中的值。当然属性也可以是只写的(write-only),这只需属性只具有一个get操作。
只写属性
using system;public class WriteDepartment {private string departname;public string Departname{set{departname=value;Console.WriteLine("The Department is :{0}",departname);}}}public class WriteDepartmain{public static int Main(string[] args){WriteDepartment d= new WriteDepartment();d.departname="COMPUTERSCIENCE";return 0;} }
在上面的例子中我们看到了如何来实现一个只写的属性。类WriteDepartment拥有一个Departname属性只实现了set操作。它省略了读操作。
总结
封装是朝着面向对象程序设计迈出的第一步。本文向您展示了一些封装的知识。用传统的读、写两种方法可以实现封装,另一种实现封装的方法是使用属性。使用属性的好处在于对象的使用者可以用一条语句来操作内部的数据。
原文: http://blog.csdn.net/willsound/archive/2002/07/11/10120.aspx public static int Main( string [] args) ... {Department d = new Department();d.SetDepartname("ELECTRONICS");Console.WriteLine("The Department is :"+d.GetDepartname());return 0;}