一、什么是封装?
可以把程序按某种规则分成很多“块“,块与块之间可能会有联系,每个块都有一个可变部分和一个稳定的部分。我们需要把可变的部分和稳定的部分分离出来,将稳定的部分暴露给其他块,而将可变的部分隐藏起来,以便于随时可以让它修改。这项工作就是封装。通俗点说就是把一个或多个项目封闭在一个物理的或者逻辑的包中。封装是通过访问修饰符来实现的。
二、为什么要封装?
- 可以保护或防止代码(数据)被我们无意中破坏。
- 我们在使用的时候只需要了解如何通过类的接口使用类,而不用关心类的内部数据结构和数据组织方法
- 面向对象程序设计一直追求高内聚低耦合,用封装恰恰可以减少耦合
- 只要对外接口不改变,可以任意修改内部实现,这个可以很好的应对变化
- 类具有了简洁清晰的对外接口,降低了使用者的学习过程
三、都有哪些封装?
- 属性封装
- 方法封装
四、属性封装
什么是属性封装?
- 属性(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版权协议,转载请附上原文出处链接和本声明。