C#面向对象编程「字段与属性」
面向对象编程原则
-
单一职责原则(对象职责明确原则)
一个对象只做好一件事情,必须专注,职责过多容易引起变化的原因就多,程序就不稳定,(高内聚,低耦合的延伸)
-
开放封闭原则(核心原则)
需求变化时尽量少的修改类的设计,而是通过扩展类来完成,即封闭修改,开放扩展
-
依赖倒置原则(OOP精髓)
基于接口编程,高层模块调用接口,底层模块实现接口,防止底层变化直接影响高层
-
接口隔离原则
尽可能多的使用专用的小接口,而不是总接口,避免接口过于复杂
-
里氏替换原则
在继承关系中字类可以替换父类,虚拟机可以根据父类变量动态的找到具体的子类对象,从而实现多态
面向对象编程目的
--------万事万物皆对象
希望用对象的概念和方法解决复杂的程序问题。用面向对象的各种方法、原则、技巧、经验等指导程序编写
类的概念
--------类是对象的映射
从以下方面把类的理解简单化
- 同类型对象的共同特征的组合,类是抽象的
- 类规定能够存储的数据类型有哪些,能够执行的方法或者说能完成的任务是什么
- 类的数据类型(属性)和动作(方法),是根据软件的需求分析得到的
- 类定义仅仅是一个说明,保存在类文件中
- 类是一种结构化的数据类型。(引用数据类型)
从以下方面把对象的理解简单化
- 对象以类为模版,通过对象使用类里面规定的数据类型和方法。
- 对象在内存中
- 对象属性使用:对象名.属性名(通过set和get方法实现)
- 对象方法使用:对象名.方法名
- 对象通过调用属性获取对应字段的值或给字段赋值。因此,属性是外界访问私有字段的一个入口
访问修饰符
- 现实中:每个人都有自己的隐私和公开内容
- 开发中:有时候开发者在设计类的时候,一些成员(字段、属性、方法)无需提供给调用者
- 好处:充分体现面向对象里面的“封装”特性(OOP三大特性:封装、继承、多态)
- 作用:保证数据安全,方便调用者使用(如果成员很多,调用者使用比较困难)
字段的使用
- 字段又称为“成员变量”,一般用来在一个类的内部做数据交互使用,通常是private修饰。
- 字段命名规范:camel命名法(单驼峰命名法)
- 字段在对象创建过程中会首先被初始化(在调用构造函数之前)
属性的使用
-
在OOP中,主要使用属性来描述对象的静态特征。
-
属性一般采用Pascal命名法,数据类型和对应字段一致。
-
属性是外界访问私有字段的一个入口,属性本身不保存任何数据。
-
使用属性能避免非法数据。用法:通常在 get 或 set 方法中添加需要的业务逻辑。
private int age; public int Age { get{return age;} set { if(age<18) age = 18; else age = value; } }
-
可以设置只读属性
- 有些属性为了保护数据,我们可以设置成只读,而不能赋值。
- 方法:将set 方法去掉即可。
- 经验:可以替代readonly。
-
属性可以单独存在
有时候某一属性值可能不是直接返回一个对应私有字段的值,而是调用一些方法,或其他业务逻辑。
private DateTime birthday; public DateTime Birthday { get { return birthday; } set { birthday = value; } } public int Age { get { return DateTime.Now.Year - birthday.Year; } }
自动属性
- 简化代码,私有字段编译器自动生成。
- 值适合于标准属性
- 不能添加任何业务逻辑
- 不能直接操作私有字段
- 不能使用只读,只写属性
字段与属性的总结与比较
- 字段主要是为类的内部做数据交互使用,字段一般是private
- 我们可以给字段赋值,也可以取值
- 当字段需要为外部提供数据时,将字段封装为属性,而不是公有化字段
- 属性一般是向外提供数据访问,主要用来描述对象的静态特征,所以,一般是public
- 属性可以设置成只读、只写、提高数据安全性
- 属性内部可以添加业务逻辑,从而避免非法数据