CH02-封装

本章目标

  1. 理解封装的概念
  2. C#实现封装
  3. 掌握C#中的访问修饰符

本章内容

1、为什么要使用封装?

案例:编写学生类,属性有姓名和年龄,然后代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Student{
public string name;
public int age;

public void SayHi(){
Console.WriteLine("大家好,我叫:{0},今年:{1}岁",name,age);
}
}

public class Test{
void Main(){
Student stu=new Student();
stu.name="张三";
stu.age=-20;//当年龄赋值为-20时,则出现的结果年龄为负,不适合现实情况,如何解决

stu.SayHi();//输出结果将会出现年龄为负
}
}

具体说明:

通过以上案例,可以看出,当在使用对象是,直接给对象的字段赋值则不能保证数据的安全,那么如何才能保证呢?通过封装可以实现。

2、什么是封装?

  1. 封装的概念:

    封装就是将类的内部实现隐藏,对外提供接口,修改类的内部实现对外没有任何影响。

    类是最基本的封装

  2. 封装的作用:

    1、保证数据安全

    2、对外提供接口,方便使用

  3. 现实生活中的封装

    1、电脑主机,通过主机将硬件封装起来,保证内部硬件 的安全

3、如何实现封装

  1. 创建类

    1
    2
    3
    public class Student{

    }
  2. 给类添加字段

    字段是保存数据,通常情况下,字段命名是以下划线开头,且字段为private,不允许外部直接访问

    1
    2
    3
    4
    public class Student{
    private string _name;
    private int _age;
    }
  3. 给类添加属性(通过get,set访问器实现),提供对外的接口

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public class Student{
    private string _name;
    //添加_name的属性
    public string Name{
    get { return _name; }
    set { _name = value; }
    }

    private int _age;//给_age添加属性,设置年龄必须在16-20岁
    public int Age{
    get{ return _age; }
    set{
    if(value<16 || value >20){
    _age=16;
    }else{
    _age=value;
    }
    }
    }
    }

    具体说明:

    1. get、set访问器保障类中字段的安全

      get:负责读取数据(读)

      set:负责设置数据(写)

    2. 如何创建只读或只写的属性

      1. 只读:

        1
        2
        3
        4
        5
        6
        7
        8
        public class Student{
        private string _name;
        public string Name{
        get{
        return _name;
        }
        }
        }
      2. 只写:

        1
        2
        3
        4
        5
        6
        7
        8
        public class Student{
        private string _name;
        public string Name{
        set{
        this._name=value;
        }
        }
        }
      3. 不对字段进行逻辑验证的操作的读写,称为:自动属性

        快捷键:prop + tab键 + tab键

        1
        2
        3
        4
        public class Student{
        // 姓名
        public string Name { get; set; }
        }

4、C#中的访问修饰符

  1. 什么是访问修饰符?

    封装使用 访问修饰符 来实现。一个 访问修饰符 定义了一个类成员的范围和可见性。

  2. C# 支持的访问修饰符如下所示:

    访问修饰符 说明
    Public 公共的, 任何公有成员可以被外部的类访问
    Private 私有的, 只有同一个类中的函数可以访问它的私有成员
    Protected 该类内部和继承类中可以访问 ,继承中会演示
    Internal 同一个程序集的对象可以访问。
    Protected internal Protected 和 Internal 的并集,符合任意一条都可以访问
  3. 具体演示:

    1. public:公有的

      public 访问修饰符允许一个类将其成员变量和成员函数暴露给其他的函数和对象。任何公有成员可以被外部的类访问。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      internal class Program
      {
      static void Main(string[] args)
      {
      Student student = new Student();
      student.StudentNo = 1001;//可直接访问
      student.StudentName = "张三";

      student.SayHi();
      }
      }

      class Student
      {
      public int StudentNo { get; set; }
      public string StudentName { get; set; }

      public void SayHi()
      {
      Console.WriteLine("hello,我叫:{0},学号:{1}",StudentName,StudentNo);
      }
      }
    2. private:私有的

      Private 访问修饰符允许一个类将其成员变量和成员函数对其他的函数和对象进行隐藏。只有同一个类中的函数可以访问它的私有成员。即使是类的实例也不能访问它的私有成员。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      internal class Program
      {
      static void Main(string[] args)
      {
      Student student = new Student();
      //student.StudentNo = 1001;//报错,私有属性不允许外部使用
      student.StudentName = "张三";

      student.SayHi();
      }
      }

      class Student
      {
      private int StudentNo { get; set; }//设置为私有属性
      public string StudentName { get; set; }

      public void SayHi()
      {
      //私有属性在本类中可以使用
      Console.WriteLine("hello,我叫:{0},学号:{1}", StudentName, StudentNo);
      }
      }
    3. protected:

      Protected 访问修饰符允许子类访问它的基类的成员变量和成员函数。这样有助于实现继承。我们将在继承的章节详细讨论这个。

    4. Internal:

      Internal 访问说明符允许一个类将其成员变量和成员函数暴露给当前程序中的其他函数和对象。换句话说,带有 internal 访问修饰符的任何成员可以被定义在该成员所定义的应用程序内的任何类或方法访问。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      internal class Program
      {
      static void Main(string[] args)
      {
      Student student = new Student();
      student.StudentNo = 1001;//可以使用,因为是本程序集里面
      student.StudentName = "张三";

      student.SayHi();
      }
      }

      public class Student
      {
      internal int StudentNo { get; set; }//设置为私有属性
      public string StudentName { get; set; }

      public void SayHi()
      {
      //私有属性在本类中可以使用
      Console.WriteLine("hello,我叫:{0},学号:{1}", StudentName, StudentNo);
      }
      }

      //创建另外项目,引入以上项目
      using OOPProject;
      namespace Test
      {
      internal class Program
      {
      static void Main(string[] args)
      {
      Student stu=new Student();

      stu.StudentName = "张三";
      stu.studentNo = 1001;//出错,不允许其他程序集调用
      }
      }
      }
    5. Protected internal

      Protected Internal 访问修饰符允许一个类将其成员变量和成员函数对同一应用程序内的子类以外的其他的类对象和函数进行隐藏。这也被用于实现继承。

本章总结

  1. 理解封装的概念
  2. 掌握如何实现封装
  3. 掌握访问修饰符

本章作业

  1. 实现魔兽游戏登录功能,注册的信息存储到数组,而非数据库,具体说明如下:

    1. 创建用户信息类(LoginInfo),属性:电子邮箱、身份证号、姓名、密码(使用封装实现),类图如下:

      1720923688340

    2. 创建登录窗体

      1720923751927

    3. 创建注册窗体

      1720923768556

    4. 创建登录主窗体,注意登录成功后显示登录成功的用户名

      1720923799529