Keep on going never give up.

Let's Go

C# 学习笔记(39)面向对象三大特性之封装

C#Lonely2019-05-16 14:34:4722次0条

在面向对象出现之前,结构化程序设计是程序设计的主流,被称为”面向过程“的程序设计。面向过程:面向的是完成事情的过程,强调的是完成事情的动作。面向过程的开发方法,通常会存在以下问题:1、软件复用性差。2、软件可维护性差。3、软件灵活性差。

面向对象:找个对象来帮你完成这件事,意在写出通用的代码,屏蔽差异。面向对象的优点:1、高效(根据现实生活的事物设计)2、安全(封装)3、易修改(继承、多态)

C#是一门面向对象的语言,所有的面向对象语言都具有三个基本的特征那就是封装、继承和多态。

封装:把客观事物封装成类,并将类内部的实现隐藏,以保证数据的完整性。

继承:通过继承可以复用父类的代码。

多态:允许将子对象复制给父类的一种能力。


封装

封装 (encapsulation):隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别。

封装途径:封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。

封装的目的:增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。

简单的来说封装指的是把类内部的数据隐藏起来,不让对象实例直接对其操作。c#中提供了属性机制来对类内部的状态进行操作。在c#中,封装可以通过Public、Private、Protected和Internal等关键字来体现。

为什么要将类内部的数据封装起来?下面通过一个简单的例子来解释其必要性,具体代码如下:

//不使用封装特性来定义一个Person类
public class Person
{
    public string _name;
    public int _age;
}

当把字段定义为公共类型时,外部对象可以对类内部的数据进行任意的操作,很可能导致当前值不符合系统的业务逻辑。下面代码演示了公共数据存在的问题。

static void Main(string[] args)
{
    Person p = new Person();
    p._name = "张莉丽"; 
    p._age = -5; //-5赋值给age字段显然是不符合业务逻辑的,人的年龄不可能为负。
}

如上代码中,尽管把-5赋给Person的_age属性没有引起编译错误,但这并不符合业务逻辑,因为在现实生活中,人的年龄不可能为负值。当我们把类的字段定义为公共类型时,外部对象可以直接对类内部的数据进行操作,此时无法对这些操作进行一些逻辑判断,这就是公共数据的问题所在。

面向对象编程中的封装特性,是一种保护状态数据完整性的方法,在面向对象编程中,应更多地定义私有数据字段。c#提供属性机制来对这种私有字段数据进行间接的操作,并且可以在属性的定义中加入更多的逻辑判断。利用封装技术,我们可以有效地对外部隐藏类内部的数据,从而避免数据损坏。

下面的代码演示了在C#中,使用封装技术后类的定义过程。

public class Person
{
    private  string _name;
    private  int _age;
    
    public string Name
    {
        get { return _name; }
        set {_name = value ; }
    }
    
    public int Age
    {
        get { return _age; }
        set
        {
            //在属性定义中,可以根据系统的业务逻辑添加逻辑代码
            if(value < 0 || value >120)
            {
                throw (new ArgumentOutOfRangeException("AgeIntPropery", value, "年龄必须在0-120之间"));
                _age = value;
            }
        }
    }
}

使用了封装技术之后,外部数据只能对属性进行操作。如果把不符合逻辑的值赋给属性Age,就会在运行时抛出异常,客户端调用可以通过捕获该异常,进行相关的错误处理操作。





暗锚,解决锚点偏移

文章评论

    嘿,来试试登录吧!