封裝概念 C#是面向對象的一門語言,面向對象的語言有三大特性:封裝、繼承、多態。而封裝可以實現一個自定義的類,從而定義新的對象 封裝是將一個或多個項目集合在一個單元中,這個單元稱之為類。這樣可以防止對實現細節的訪問 C#封裝可以根據需要通過修飾符實現類成員的範圍和可見性。訪問修飾符有: public ...
封裝概念
C#是面向對象的一門語言,面向對象的語言有三大特性:封裝、繼承、多態。而封裝可以實現一個自定義的類,從而定義新的對象
封裝是將一個或多個項目集合在一個單元中,這個單元稱之為類。這樣可以防止對實現細節的訪問
C#封裝可以根據需要通過修飾符實現類成員的範圍和可見性。訪問修飾符有:
public:公共的,任何地方都可以訪問,但是需要引用命名空間
private:私有的,類的內部才可以訪問
internal:內部的,預設的,程式集中可以訪問,程式集就是命名空間
protected:被保護的,類的內部和類的父類和子類中可以訪問
Protected internal :protected和internal的並集,符合任意一條都可以訪問
示例
觀察如下代碼
1 namespace Student 2 { 3 class Student 4 { 5 public string _code; 6 public string _sex; 7 public int _age; 8 } 9 10 class StudentAction 11 { 12 static void Main(string[] args)3 { 14 Student XiaoMing = new Student(); 15 XiaoMing._code = "001"; 16 XiaoMing._sex = "男"; 17 XiaoMing._age = 18; 18 } 19 } 20 }
用public修飾的屬性,不夠安全,成員函數可以直接訪問這些變數
用Private 修飾符則允許一個類將其成員變數和成員函數對其他的函數和對象進行隱藏。只有同一個類中的函數可以訪問它的私有成員。
在VS中快速封裝的快捷鍵為:Ctrl+R+E,如下圖:
使用prvite後,則函數將不能再對其成員變數訪問,如下圖:
需要對外提供一個介面,代碼如下:
1 namespace StudentSpace 2 { 3 class Student 4 { 5 private string _code; //成員變數 6 private string _sex; 7 private int _age; 8 9 public string Code //進行封裝的時候要用public,保證類外可以使用 10 { 11 get 12 { 13 return _code; //成員屬性 14 } //屬性一般用小寫字母表示,但是封裝的時候首字元要大寫 15 16 set 17 { 18 _code = value; 19 } 20 } 21 22 public string Sex 23 { 24 get 25 { 26 return _sex; //成員屬性 27 } 28 set 29 { 30 _sex = value; 31 } 32 } 33 34 public int Age 35 { 36 get 37 { 38 return _age; //成員屬性 39 } 40 41 set 42 { 43 _age = value; 44 } 45 } 46 } 47 }
主函數調用:
1 //主函數中調用 2 class StudentAction 3 { 4 static void Main(string[] args) 5 { 6 Student XiaoMing = new Student(); 7 XiaoMing.Code = "001"; 8 XiaoMing.Sex = "男"; 9 XiaoMing.Age = 18; 10 11 Console.WriteLine(XiaoMing.Code); 12 Console.WriteLine(XiaoMing.Sex); 13 Console.WriteLine(XiaoMing.Age); 14 } 15 }
主函數執行結果如下:
遇到的問題
在此期間,筆者將namespace與class的名稱都寫成了Student,導致在主函數中調用時直接寫Student報錯誤
如果是在同一個namespace封裝函數並且調用函數沒有問題
不在同一個namespace程式就會認為調用的是namespace而不是class,所以報錯,修改方法有兩種:
1、修改下namespace使兩者的命名不一致;
2、使用namespace.class調用,將class名稱跟在namespace名稱後面
封裝中的set
在封裝中get 是讀取即屬性取值,set 是賦值即屬性賦值,也就是主函數不能調用_code,而能調用的是Code,但賦值的卻是_code
在封裝過程中對於學生的性別要有特殊處理,學生的性別要麼是男要麼是女,其他值為非法值,不能允許非法值輸入
代碼如下:
1 public string Sex 2 { 3 get 4 { 5 return _sex; //成員屬性 6 } 7 set 8 { 9 if (value == "男" || value == "女") 10 _sex = value; 11 else 12 _sex = "性別隻能是男或女"; 13 } 14 }
執行主函數: