天天看点

属性和索引器

属性是字段向方法的过渡

1

属性和索引器

public class Person

2

属性和索引器

 {

3

属性和索引器

4

属性和索引器

 public int age;//直接公开字段,无法控制用户输入非法的值

5

属性和索引器

6

属性和索引器

7

属性和索引器

 //Java模式的对Age控制方式,需要两个方法,Get和Set。麻烦麻烦阿!

8

属性和索引器

 public int GetAge()

9

属性和索引器

10

属性和索引器

 return Age;

11

属性和索引器

 }

12

属性和索引器

13

属性和索引器

 public void SetAge(int personAge)

14

属性和索引器

15

属性和索引器

 if (personAge < 18)

16

属性和索引器

17

属性和索引器

 personAge = 18;

18

属性和索引器

19

属性和索引器

 if (personAge>81)

20

属性和索引器

21

属性和索引器

 personAge = 81;

22

属性和索引器

23

属性和索引器

 age = personAge;

24

属性和索引器

25

属性和索引器

26

属性和索引器

 //C#模式的Age控制方式,Set和Get是属性的两个访问器,管理方便

27

属性和索引器

 public int Age

28

属性和索引器

29

属性和索引器

 set

30

属性和索引器

31

属性和索引器

 if (value < 18)

32

属性和索引器

33

属性和索引器

 value = 18;

34

属性和索引器

35

属性和索引器

 if (value > 81)

36

属性和索引器

37

属性和索引器

 value = 81;

38

属性和索引器

39

属性和索引器

 age = value;

40

属性和索引器

41

属性和索引器

 get

42

属性和索引器

43

属性和索引器

 return age;

44

属性和索引器

45

属性和索引器

46

属性和索引器

47

属性和索引器

48

属性和索引器

现在我们来看一个应用,描述部门和员工的一对多的关系。先看一个错误的设计:

属性和索引器

 public class Space

属性和索引器
属性和索引器
属性和索引器

 public static void Main(string[] args)

属性和索引器
属性和索引器

 Department dep = new Department();

属性和索引器

 //错误一,Staffs所存储的值类型无法被控制。Staffs又可以放字符串,又可以放对象 数据无法统一。

属性和索引器

 dep.Staffs.Add("leo"); //放字符串

属性和索引器

 dep.Staffs.Add(new Staff("King")); //放对象

属性和索引器
属性和索引器

 //错误二,一旦Department对Staffs的设计改变(比如用数组描述),遍历代码就要改变

//遍历1:类Department将Staffs描述为字符串

属性和索引器

 for (int i = 0; i <= dep.Staffs.Count - 1; i++)

属性和索引器
属性和索引器

 System.Console.WriteLine(dep.Staffs[i]);

属性和索引器
属性和索引器

//遍历2:类Department将Staffs描述为数组

属性和索引器

 for (int i = 0; i <= dep.Staffs.Length - 1; i++)

属性和索引器
属性和索引器
属性和索引器
属性和索引器

//造成用户必须根据Staffs数据描述的方式不同而编写不同的代码的原因为类Department设计不合理。

属性和索引器
属性和索引器
属性和索引器
属性和索引器

 public class Department

属性和索引器
属性和索引器

 //这是一个错误的设计,向用户暴露了Staffs的数据结构

属性和索引器

 public System.Collections.ArrayList Staffs = new System.Collections.ArrayList();

属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器

 public Staff[] Staffs = new Staff[] { new Staff("leo"), new Staff("King") };

属性和索引器
属性和索引器
属性和索引器

 public class Staff

属性和索引器
属性和索引器

 public Staff(string name)

属性和索引器
属性和索引器

 Name = name;

属性和索引器
属性和索引器
属性和索引器

 public string Name;

属性和索引器

好的设计方法是向用户关闭数据结构的细节

属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器

 //无论将来Staffs的数据结构有什么变化,调用的代码不会有变化

属性和索引器

 dep.AddStaff(new Staff("leo"));

属性和索引器

 dep.AddStaff(new Staff("King"));

属性和索引器

 for (int i = 0; i <= dep.StaffsCount - 1;i++ )

属性和索引器
属性和索引器

 System.Console.WriteLine(dep.GetStaffFromIndex(i).Name);

属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器

 //这是正确的设计

属性和索引器

 private System.Collections.ArrayList Staffs = new System.Collections.ArrayList(); //private隐藏了Staffs的数据结构

属性和索引器
属性和索引器

 public int StaffsCount //统一遍历代码

属性和索引器
属性和索引器
属性和索引器
属性和索引器

 return Staffs.Count;

属性和索引器
属性和索引器
属性和索引器
属性和索引器

 public int AddStaff(Staff staff) //统一Staffs的数据结构

属性和索引器
属性和索引器

 return this.Staffs.Add(staff);

属性和索引器
属性和索引器
属性和索引器

 public void Remove(Staff staff)

属性和索引器
属性和索引器

 this.Staffs.Remove(staff); 

属性和索引器
属性和索引器
属性和索引器

 public Staff GetStaffFromIndex(int index)

属性和索引器
属性和索引器

 return (Staff)this.Staffs[index];

属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器

49

属性和索引器

50

属性和索引器

51

属性和索引器

52

属性和索引器

53

属性和索引器

54

属性和索引器

55

属性和索引器

如果我们引入索引器,那代码能更合理

属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器

 System.Console.WriteLine(dep[i].Name); //注意下标 

属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器

 private System.Collections.ArrayList Staffs = new System.Collections.ArrayList();

属性和索引器
属性和索引器

 public int StaffsCount

属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器

 public int AddStaff(Staff staff)

属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器
属性和索引器

 public Staff this[int index]

属性和索引器
属性和索引器
属性和索引器
属性和索引器

 Staff[index] = value;

属性和索引器
属性和索引器
属性和索引器
属性和索引器

 return (Staff)Staff[index];

属性和索引器
属性和索引器
属性和索引器
属性和索引器

注意代码的第40的变化,不过在一个类中,只能有一个this[int index]。

注意使用了第40行的索引器,第12行可以象数组下标一样用啦。

不过,这样的设计还不完善,请看下篇,初见继承威力。

本文转自shyleoking 51CTO博客,原文链接:http://blog.51cto.com/shyleoking/806278