天天看點

屬性和索引器

屬性是字段向方法的過渡

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