背景:自毕业以后出来工作了也有几年了,期间前后端都在干,后端通过C#语言编写;由于自己水平问题,写出来的代码自己维护起来都费劲,犹如屎山一般;好些基础知识点第一次学习的时候没有消化掉,随着时间越来越长也逐渐忘记了。因此决定重新学习一下C#基础知识,为了避免再次遗忘,决定写文档记录自己所学。也希望路过的大佬看见小斯记录不对的地方,给出指导,非常感谢。
总所周知, 面向对象三个特征:封装、继承、多态,下面就依依记录自己学习的理解。
顾名思义,在我们日常生活中,封装有哪些实际例如呢?比如车子,开车我们只是转动方向盘和油门刹车就可以进行行驶,具体内部是如何实现的我们不需要知道;又例如,把一个礼物包装的很精美,也是一种形式的封装。
在程序设计中,类、对象、方法也是封装的一种变现;将字段封装成属性、将多个属性封装成一个类;将一段代码封装成一个方法;将多个类封装成一个程序集,提供统一对外访问的接口。 这样设计的好处:此封装的调用者不用关注内部是如何实现,不能随意串改内部的实现,内部实现修改以后调用者部分不需要进行调整。下面以几个实例的代码来加深理解。
将字段封装成属性
PersonInfo personInfo = new PersonInfo();
personInfo.Age = 40;//通过属性赋值
Console.WriteLine(personInfo.Age);//通过属性读值
Console.ReadKey();
class PersonInfo
{
/// <summary>
/// 将_Age字段封装到Age属性中
/// </summary>
private int _Age;
public int Age
{
get { return _Age; }
set { _Age = value; }
}
}
通过以上代码分析,为什么需要将字段封装成属性呢,直接访问字段不可以吗,把_Age字段改成共有的,直接调用赋值。
PersonInfo personInfo = new PersonInfo();
personInfo.Age = 40;//通过属性赋值
Console.WriteLine(personInfo.Age);//通过属性读值
Console.ReadKey();
class PersonInfo
{
public int Age;
}
当然这样也是可以的,但是有个问题,假如我们要对年龄赋值的时候做一些合法性的限制;取值的时候需要做一些限制等就不是很方便;例如限制年龄在0-120岁之间,通过封装的属性就可以这么实现。
PersonInfo personInfo = new PersonInfo();
//就不需要在这里进行赋值前的判断了
personInfo.Age = 121;//通过属性赋值
Console.WriteLine(personInfo.Age);//通过属性读值
Console.ReadKey();
class PersonInfo
{
/// <summary>
/// 将_Age字段封装到Age属性中
/// </summary>
private int _Age;
public int Age
{
get {
//这里也可以做一些权限校验,比如有这个权限才给返回年龄
return _Age;
}
set
{
//给字段设置值的时候做一些判断
if (value <= 0 || value > 120)
throw new Exception("年龄非常");
_Age = value;
}
}
}