面向对象三大基本特征之一——封装之属性

封装

封装的定义

封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。举个例子,比如洗衣机各个组件被封装起来,只能通过按钮来操作它们,这种隐藏内部实现,对外提供操作接口的方式,我们称之为封装。

封装的好处

封装可以让使用者不用担心对象内部具体实现,同时又可以确保使用者无法更改内部代码。它可以让代码更易于理解和维护,也加强了代码的安全性。

定义属性

如何定义属性?

C#中属性的作用是提供灵活的机制来读写私有字段的值。C#中属性就是对字段的封装,通过对字段的封装,可以阻止不合法数据的录入,从而保护内部数据的安全,提高字段访问的安全性和灵活性。

C#中的属性结合了字段和方法的优点,对于对象的使用者,调用属性的方式和调用字段的方式相同;

对于类的使用者,属性是两个类似于方法的代码块,分别是get访问器(访问)和set访问器(赋值)。

为什么要使用属性?

在代码中直接对类进行访问,存在很大的缺陷,无法保证数据的合理性,此时我们可以使用属性对字段进行封装。

我们可以举个例子来让大家看一下。

新建一个控制台应用程序,然后添加一个Customer类。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FengZhuang
{
    public class Customer //publc设置为公开的类
    {
        public string name; //定义姓名
        public int age; //定义年龄
        public string address; //定义地址
    }
}

然后在Program类里面实例化一个customer对象,并对Customer类的字段进行赋值。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FengZhuang
{
   public class Program
    {
        static void Main(string[] args)
        {
            Customer customer = new Customer(); //实例化一个customer对象
            customer.name = "张三";
            customer.age = 200;
            customer.address = "北京";

            //打印客户信息
            Console.WriteLine("客户信息:");
            Console.WriteLine("姓名:" + customer.name);
            Console.WriteLine("年龄:" + customer.age+"岁");
            Console.WriteLine("地址:" + customer.address);
        }
    }
}

运行结果如图所示,年龄为200岁,这样的数据显然是不合理的。
在这里插入图片描述

所以当我们直接对一个类中的字段进行直接访问时,就会存在这一问题。如何避免这样不合理的数据录入?可以使用属性对这样的字段进行封装。

使用属性进行封装的步骤?

1、私有化字段

2、定义属性,并题库set get访问器对字段进行访问

3、在set get访问器中添加代码保证数据的安全

如何使用属性?

下面通过一个案例来演示一下如何在程序中使用属性。

新建一个Customer类

namespace FengZhuang
{
    public class Customer //publc设置为公开的类
    {
        public string name; //定义姓名字段
        private int age; //定义年龄字段
        
        //字段首字母小写,属性首字母大写
        //封装快捷键:选中需要封装的字段,然后按Ctrl+R+E
        public int Age //定义Age属性
        {
            get //get访问器用来获取字段的值
            {
                return age;
            }
            set //set访问器,对当前字段进行赋值
            {
                //限定age的值
                if (value >=0 && value <=110)
                {
                    age = value;
                }
                else
                {
                    Console.WriteLine("年龄输入有误,默认设置为18岁");
                    age = 18;
                }
            }
        }
        public string address; //定义地址字段
    }
}

在Program类中代码如下:

namespace FengZhuang
{
   public class Program
    {
        static void Main(string[] args)
        {
            Customer customer = new Customer(); //实例化一个customer对象
            customer.name = "张三";
            customer.Age = 200; //age字段被私有化,只能通过Age属性进行访问
            customer.address = "北京";

            //打印客户信息
            Console.WriteLine("客户信息:");
            Console.WriteLine("姓名:" + customer.name);
            Console.WriteLine("年龄:" + customer.Age+"岁");
            Console.WriteLine("地址:" + customer.address);
        }
    }
}

此时,结果如图所示:当我们输入不合理的年龄200时,年龄被自动改成18岁,很好地避免了不合理数据的出现。
在这里插入图片描述

属性的分类:

通过提供不同的访问器,可以将属性分为以下3类:

1、只读属性:只含get访问器

2、只写属性:只含set访问器

3、读写属性:包含get访问器和set访问器

下面通过一个案例来演示不同类型的属性的定义和使用。

只写属性:set
在这里插入图片描述

当对数据进行读取时,会报错,缺少get(读取)访问器。
在这里插入图片描述
只读属性:get
在这里插入图片描述
当对数据进行赋值时,会报错,缺少set(赋值)访问器。
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值