面向对象之封装五

成员属性

一.成员属性的基本概念

基本概念:

1.用于保护成员变量

2.为成员属性的获取和赋值添加逻辑处理

3.解决3P的局限性

​ public ——内外访问

​ private ——内部访问

​ protected ——内部和子类访问

(访问:修改或者获取它)

属性可以让成员变量在外部实现只能获取不能修改,或者只能修改不能获取

二.成员属性的基本语法

访问修饰符 属性类型 属性名

{

​ get{}

​ set{}

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//在namespace声明,不多写了
class Person{
private string name;
private int age;
private int money;
private bool sex;
//属性的命名一般使用帕斯卡命名法
public string Name{
//get要有返回值
get{
//get意味着这个属性可以获取的内容
//可以在返回之前添加一些逻辑规则
return name;
//通过Name的属性,你可以访问到name这个变量.
}
set{
//可以在设置之前添加一些逻辑规则
//value 关键字,用于表示外部传入的值,只在set里面有用
name =value;
//只要外面赋值给Name属性了,就会将值传给value,之后再把值传给name。
}
}
}

三.成员属性的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
namespace 语法知识
{
class Person{
private string name;
private int age;
private int money;
private bool sex;
public string Name{
get{
return name;
}
set{
name =value;
}
}
public int Money{
get{
return money-5;
//解密处理
}
set{
if(value<0){
value=0;
Console.WriteLine("钱不能少于0,强制设置为0");
}
//保护处理
money=value-5;
//加密处理
}
}
//通过属性可以实现一些简单的加密解密处理,例如可以在set设置的时候将值加上5,在get获取得到输出的时候将值减去5.这就是最简单的加密解密过程了。
}
internal class Program
{
static void Main(string[] args)
{
Person p =new Person();
p.Name="大帅哥";
//执行的是set语句块
Console.WriteLine(p.Name);
//执行的是get语句块。
p.Money=1000;
Console.WriteLine(p.Money);
}
}
}
```

四.成员属性中,get和set前面可以加访问修饰符

注意:

1.默认不加,会使用属性申明时的访问权限

2.加的访问修饰符要低于属性的访问权限

3.不能让get和set的访问权限都低于属性的权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  class Person{
private int money;
public int Money{
//get默认不加访问修饰符时,默认是外面的访问修饰符,在这里是public。
private get{
return money-5;
}
//加了private之后,表明,在之后想要调用类的属性时,只能是实现set操作(设置)而不能实现get(获取)操作了。
//此时Console.WriteLine(p.Money);将会保错,因为get访问器不可访问。
//set同理,此时p.Money=1000将报错,因为不能实现设置功能了。
set{
if(value<0){
value=0;
Console.WriteLine("钱不能少于0,强制设置为0");
}
//保护处理
money=value-5;
//加密处理
}
}

五.get和set可以只有一个

注意:

只有一个时,没有必要在前面加上访问修饰符

一般情况下,只会出现只有get的情况,基本不会出现只有set的情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Person{
private bool sex;
{
get{
return sex;
}
//一般我们可能只希望别人得到数据,并不希望别人改写数据,所以可以只有一个get。
}
}
//在主函数内
Person p=new Person();
Console.WriteLine(p.Sex);
P.Sex=false;
//会报错

六.自动属性

作用:外部能得不能改的特征。

如果类中有一个特质是只希望外部能得不能改,又没什么特殊处理(没有在get和set中写逻辑的需求和想法),那么可以直接使用自动属性。

1
2
3
4
5
6
7
8
9
10
class Person{
public float Height{
get;
private set;
//自动属性
//可以理解为一个自动的成员变量,在类中我们其实并没有一个成员变量来表示身高,所以,在成员属性中声明之后,会自动生成一个成员变量进行存储,虽然我们并不知道这个变量的名字是什么。
//这个Height的成员属性只能从外面得到,不能在外面进行修改。
//在内部改这个属性就可以了。
}
}

面向对象之封装五
https://gaster44.github.io/2023/12/19/面向对象之封装五/
作者
huangjinhong
发布于
2023年12月19日
许可协议