C#-封裝(七)


封裝概念
  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         }

  執行主函數:

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM