类是程序的基本单元;
类包括属性和方法;
类是模板,程序运行的时候都是对象;
常见问题:
(1)面向对象的三大特性
1)封装(开发中用的最多)
- 隐藏内部实现细节,模块开发者只关心内部实现和借口要求,模块调用者只关心接口调用;
- 好处:安全保证(避免代码外漏),快速应用(直接应用),团队协作(多人同时工作);
- 应用:类是程序的基本单元,也是封装的基本单元,但是类可以同样被模块封装;
2)继承
- 复用现有代码;
- 好处:一处更新,处处更新; 弊端:关联容易复杂;
- 应用:object, Form
3)多态
- 让一个对象的接口可以根据不同的请求,做成不同的响应;
- 好处:程序扩展容易、方便维护;
- 应用:继承多态、接口多态(简单工厂、抽象工厂);
注意:后面详细介绍多态
(2)开发的OPP原则
1)单一职责原则(对象职责明确原则)
- 要求:一个对象只做好一件事,必须专注,职责过多容易引起变化的原因就多,程序就不稳定(高内聚,低耦合的延伸);
2)开放封闭原则(核心原则)
- 要求:需求变化的时候尽量少的修改类的设计 ,而是通过扩展类来完成;即封闭修改,开放扩展;
3)依赖倒置原则(OPP精髓)
- 要求:基于接口编程,高层模块调用接口,底层模块实现接口 ,防止底层变化直接影响高层;
4)接口隔离原则
- 要求:尽可能多的使用专用的小接口,而不是使用总接口,避免接口过于复杂;
5)里氏替换原则
- 要求:在继承关系中,子类可以替换父类,虚拟机可以根据父类变量,动态地找到具体的子类对象,从而实现多态;
(3)对象和类
对象:
任何存在的实体都是对象,是真是存在的,包括静态特征和动态特征两个方面;
静态特征:表示对象的属性,用来储存对象本身的数据;
动态特征:表示对象的方法,用来说明对象能做什么;
对象的作用:
1.数据存储在对象的属性里;
2.软件的功能都是通过方法实现;
类:
将同一类对象共有的属性、方法抽象出来,组织在一个单元中,称之为类;
对象实际上是同一类事物的个体;
类与对象的区别
- 类定义的实际上是一个抽象模型,比如“汽车”,在这个模型中,定义“属性”和“方法”;
- 对象实际上是按照这个类的模型,具体创造出的实体,每个属性都有具体的“值”;
(4)类的定义与对象的使用
1)类的定义规范:
看例子:
namespace Demo
{
/// <summary>
/// 学生类
/// </summary>
class Student
{
// 私有字段:学员
private int studentId;
// 私有字段:学员姓名
private string studentName = "";
//属性:学号
public int StudentId
{
get { return studentId; }
set { studentId = value; }
}
//属性:学生姓名
public string StudentName
{
get { return studentName; }
set { studentName = value; }
}
//获取学员信息
public string GetStudent()
{
//这里直接使用的是字段
string info = string.Format("姓名:{0} 学号{1}", studentName, studentId);
return info;
}
}
}
namespace Demo
{
class Program
{
static void Main(string[] args)
{
//创建对象
Student objStudent = new Student();
//给对象属性赋值
objStudent.StudentId = 10001;
objStudent.StudentName = "guobaoyan";
//调用对象方法
string info = objStudent.GetStudent();
Console.WriteLine(info);
//类的外面对字段的访问都是通过get和set方法
Console.WriteLine(objStudent.StudentName);
Console.ReadKey(true);
}
}
}
2)类中属性和方法的使用
- 以类为模板,创建一个或者多个对象,通过对象调用类中的属性或者方法;
- 给对象赋值,取值:对象名.属性名;
- 调用方法:对象名.方法名;
(5)字段与属性
1)访问修饰符
访问修饰符:
作用:限制对象的属性或方法的可访问范围(类的内部,类的外部)
类型:private(私有的:外部不可见 ) public(公有的:外部可见)
注意:默认private(只能在类的内部使用);希望以对象的形式访问,需要定义为public
2)字段
字段称为“成员变量 ”;通常只供类内部的不同方法使用;所以使用private修饰;
字段命名一般使用camel命名法
字段的通俗理解:
- 私有化:字段类似私有财产,只供个人使用;使用private修饰;
- 添加标准:一个类中需要添加几个字段,根据程序编写的需要决定;
属性
属性是操纵的对应的私有字段(get, set);
属性的作用 :
- 作用:在面向对象 设计中主要使用属性 描述对象静态特征;
- 要求:一般使用Pascal命名方法,数据类型和字段一致,使用 public修饰;
属性的理解:
- 属性其实是外界访问私有字段的入口,属性本身不保存任何数据;
- 给属性赋值 ,实际上是给属性指向的私有字段赋值 ;
- 读取属性的值,实际上是获取属性指向的私有字段的值;
使用属性避免非法数据
在get和set中都可以 添加我们需要的任意逻辑,从而有效避免非法数据 ;
使用属性设置只读、只写
没有set方法
没有对应私有字段的属性:
没有对应的私有字段,而是一个逻辑,一个计算过程
字段与属性的对比:
字段(成员变量):
- 主要是为类的内部作数据交互使用,字段一般是private;
- 字段可以赋值,可以取值;(类的内部)
- 字段为外部提供数据的时候,请将字段封装为属性,而不是使用共有字段,这是面向对象提倡的;
属性:
- 属性一般是想外提供数据,主要用来描述对象的静态特征,常为public;
- 可以按照自己的逻辑,设置为只读、只写,提高安全性 ;
- 属性内部可以添加需要的业务逻辑,避免非法数据;
自动属性:
不能直接操纵私有字段;不能添加业务逻辑;不能设置只读、只写;只适用于 标准形式 ;