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         }

  执行主函数:

  

猜你喜欢

转载自www.cnblogs.com/tynam/p/9611267.html