C#面向对象之封装(超详细)

一、什么是封装?

可以把程序按某种规则分成很多“块“,块与块之间可能会有联系,每个块都有一个可变部分和一个稳定的部分。我们需要把可变的部分和稳定的部分分离出来,将稳定的部分暴露给其他块,而将可变的部分隐藏起来,以便于随时可以让它修改。这项工作就是封装。通俗点说就是把一个或多个项目封闭在一个物理的或者逻辑的包中。封装是通过访问修饰符来实现的。


二、为什么要封装?

  1. 可以保护或防止代码(数据)被我们无意中破坏。
  2. 我们在使用的时候只需要了解如何通过类的接口使用类,而不用关心类的内部数据结构和数据组织方法
  3. 面向对象程序设计一直追求高内聚低耦合,用封装恰恰可以减少耦合
  4. 只要对外接口不改变,可以任意修改内部实现,这个可以很好的应对变化
  5. 类具有了简洁清晰的对外接口,降低了使用者的学习过程

三、都有哪些封装?

  1. 属性封装
  2. 方法封装

四、属性封装

什么是属性封装?

  • 属性(Property)是类(class)、结构(structure)和接口(interface)的命名(named)成员。类或结构中的成员变量或方法称为域(Field)。属性(Property)是域(Field)的扩展,且可使用相同的语法来访问。它们使用访问器(accessors)让私有域的值可被读写或操作。
  • 属性不会占用内存。相反,属性具有可读写或计算属性值的访问器。
  • 在类以外访问私有域,这样我们是不能直接访问的,可以通过属性来间接访问这些私有域。
  • 属性的访问器包含有助于获取(读取或计算)或设置(写入)属性的可执行语句。访问器声明可包含一个get访问器、一个set访问器,或者同时包含二者。

字段和属性有什么区别?

  • 字段:占用内存
  • 属性:不占内存

字段和属性有什么关系?

属性必须依赖一个字段

下来我们具体了解一下属性封装的方法:

class Person
    {
        //创建四个成员变量,并且都是私有的
        private int age;
        private double code;
        private string name;

        //想要在其他类中访问它们,就得通过属性访问器间接访问它们

        //注意:属性名首字母大写

        //第一种封装方法(手动封装)
        public int Age {
            get { 
                return age; //获取变量值
            }
            set {
                age = value;//设置变量值
            }
        }
        //第二种封装方法(鼠标放在要封装的变量末尾,右击然后单击快速操作和重构最后回车即可)
        public double Code { get => code; set => code = value; }
        //第三种封装方法(鼠标放在要封装的变量末尾,按ctrl+r+e然后点击应用即可)
        public string Name { get => name; set => name = value; }
        //第四种封装方法(输入propfull按两下tab,然后改你需要的数据类型、变量名和属性名即可)
        private int height;

        public int Height
        {
            get { return height; }
            set { height = value; }
        }
        //第五种封装方法(输入prop按两下tab,然后只需要改数据类型和变量名即可,因为这种方式同时创建了成员变量和属性)
        public int Weight { get; set; }
    }

五、方法封装

以数组求和为例

第一种无参数的方法(没有返回值的方法)

class Program
    {
        static void Main(string[] args)
        {
            Sum dd = new Sum();
            dd.sum1();
        }
    }
    class Sum {
        public void sum1() {
            int[] ayr = { 1, 2, 3, 4 };//初始化一个数组
            int count = 0;
            Console.WriteLine("数组为:{0},{1},{2},{3}",ayr[0],ayr[1],ayr[2],ayr[3]);
            for (int i = 0; i < ayr.Length; i++)//遍历出数组中的每个值
            {
                count += ayr[i];
            }
            Console.WriteLine("数组之和为:{0}",count);
            Console.ReadLine();
        }
    }

效果图
在这里插入图片描述
第二种有参数的方法(有返回值的方法)

class Program
    {
        static void Main(string[] args)
        {
            Sum ddd = new Sum();
            int[] sz = {2,4,6,8,10,12};
            Console.WriteLine("数组的和为:{0}",ddd.sum2(sz));
            Console.ReadLine();
        }
    }
    class Sum {
        public int sum2(int[] add) {
            int count1 = 0;
            Console.WriteLine("数组为:");
            for (int i = 0; i < add.Length; i++)
            {
                Console.Write("{0}|",add[i]);//将数组中每个数据输出
                count1 += add[i];
            }
            Console.WriteLine();
            return count1;
        }
    }

效果图
在这里插入图片描述


六、方法封装中的形参和实参?

  • 形参(形式参数):在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。
  • 实参(实际参数):函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参。

形参和实参的联系:

形参和实参的功能是传递数据,发生函数调用时,实参的值会传递给形参。


七、get和set在属性封装中的应用?

  • get访问器的属性称为只读属性。
  • set访问器的属性称为只写属性。

若只带有get访问器,则无法对属性赋值;若只带有set访问器,则无法对属性进行引用;既带有get访问器又带有set访问器,则属性称为读写属性。

属性与普通变量不同就在于:

  • 属性包括get和set访问器
  • 可以通过设置访问器的访问权限来控制对属性的访问权限

在编程过程中,如果遇到有限制性的字段,那么get和set的作用就很大

class Program
    {
        private int _age;
        public int age
        {
            get { 
                return _age; 
            }
            set
            {
                if (value >= 10 && value <= 20)
                    _age = value;
                else
                    Console.WriteLine("年龄不适合!!!");
            }
        }
    }



书山有路勤为径,学海无涯苦作舟!


点个赞再走???


版权声明:本文为liu991029原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。