CS3SL3——面向对象七大原则
CS3SL3——面向对象七大原则
为什么要有七大原则
七大原则总体要实现的目标是:高内聚、低耦合
使程序模块的可重用性、移植性增强
何为高内聚低耦合
从类角度来看:高内聚低耦合要减少类内部,对其他类的调用
从功能块来看:高内聚低耦合要减少模块之间的交互复杂度
面向对象七大原则
注意
初学程序阶段,不要过多的纠结于七大原则,
先用最适合自己的方法把需求实现了,再使用七大原则去优化
不要想着一步到位,要循序渐进,面向对象编程能力提升是需要经验积累的
单一职责原则
即:一个类只处理自己应该处理的内容,不应该什么都写在一起
SRP (Single Responsibility Principle),类被修改的几率很大,因此应该专注于单一的功能。
如果把多个功能放在同一个类中,功能之间就形成了关联,改变其中一个功能,有可能中止另一个功能。
举例:假设程序、策划、美术三个工种是三个类,他们应该各司其职,在程序世界中只应该做自己应该做的事情。
开闭原则
OCP (Open-Closed Principle),即:对拓展开放,对修改关闭,新加功能尽可能是增加方法而不是改源代码
拓展开 ...
CS3SL2——UML类图
CS3SL2——UML类图
UML
UML(Unified Modeling Language,UML),即统一建模语言
是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言,是非专利的第三代建模和规约语言。
UML 是面向对象设计的建模工具,独立于任何具体程序设计语言。
简单来说:使用一些高级的UML可视化软件,不用写代码,通过做一些图表相关内容就可以直接生成代码,在其基础上进行开发,
它的最终目标是直接能通过图形就把业务逻辑就完成了。
UML类图
UML类图是UML其中很小的一部分,我们学习它的目的是帮助我们进行面向对象程序开发时理清对象关系,养成面向对象编程习惯
UML类图的主要作用就是,帮助我们前期或者后期建立面向对象编程中的各种类帮助我们理清类、接口相互之间的关系
至少在做项目前,我们就知道要建立几个类,几个接口了,UML类图让我们的编程思路更清晰
UML类图中关系说明
关联:类A会有一个类B成员作为它的成员变量
直接关联:母鸡类有一个行为是下蛋,它和气候有直接关联
聚合:例如地图类会聚合围墙类,鸟群类聚合大雁类(类似于包含的感觉)
依赖关系:比如动物类依赖于 ...
CS3SL1——多脚本文件
CS3SL1——多脚本文件
了解C#项目脚本格式和路径
打开解决方案所在文件夹,可以看到如下内容
.vs —— 存储当前用户在解决方案中的工作配置
项目文件夹,可有多个项目
.sln 文件 —— Visual Studio 解决方案文件
此文件一般不应该手动编辑,它主要用于将项目、项目项和解决方案项组织到解决方案中。双击该文件会通过 Visual Studio 打开解决方案
打开其中一个工程,它的固定结构如下:
bin —— 存放C#工程编译出来的exe和dll文件
obj —— 存放C#项目编译过程中生成的中间临时文件
cs 文件以及自己创建的文件夹(左图除了bin和obj都是自己创建的)
cs 文件就是C#源代码文件,而在IDE内部创建的文件夹也会在工程路径下创建
csproj 文件 —— C#项目配置文件,配置编译器版本和引用项目等等
新建脚本文件
在IDE内,可以手动操作创建 cs 文件,一般就是类、接口、结构体,就对应一个脚本
Visual Studio的创建方式就是在要新建脚本的项目内右键 —— 添加 —— ...
CS3L27——抽象类和接口的区别
CS3L27——抽象类和接口的区别
抽象类和接口相同点
都可以被继承,都不能直接实例化
都可以包含方法申明,子类必须实现未实现的方法
都遵循里氏替换原则
抽象类和接口的不同点
抽象类中可以有构造函数;接口不能
抽象类只能被单一继承;接口可以继承多个
抽象类可以有成员变量;接口不能
抽象类中可以申明成员方法,虚方法,抽象方法,静态方法;接口只能申明没有实现的抽象方法
抽象类可以使用访问修饰符;接口中建议不写,默认 public
如何选择抽象类和接口
表示对象的用抽象类,表示行为拓展的用接口
不同对象拥有的共同行为,我们往往可以使用接口来实现
例如:动物是一类对象,可以使用抽象类;而飞翔是一个行为,就可以选择接口
CS3L26——结构体和类的区别
CS3L26——结构体和类的区别
结构体和类区别概述
结构体和类最大的区别是在存储空间上,结构体是值类型,类是引用类型
因此他们的存储位置一个在栈上,一个在堆上
值和引用对象在赋值时的就存在区别
结构体和类在使用上很相似,结构体甚至可以用面向对象的思想来形容一类对象
结构体具备着面向对象思想中封装的特性,但是不具备继承和多态的特性,因此大大减少了它的使用频率
由于结构体不具备继承的特性,所以它不能够使用 protected 保护访问修饰符
细节区别
结构体是值类型,类是引用类型
结构体存在栈中,类存在堆中
结构体成员不能用 protected 保护访问修饰符,类可以
结构体成员变量申明不能指定初始值,类可以
结构体不能申明无参的构造函数,而类可以
结构体申明有参构造函数后,无参构造不会被顶掉
结构体不能申明析构函数,类可以
结构体不能被继承,类可以
结构体需要在构造函数中初始化所有成员变量,而类随意
结构体不能被静态 static 修饰(不存在静态结构体)类可以
结构体不能在自己内部申明和自己一样的结构体变量,类可以
结构体的特别之处
结构体可以继承接口,因为接口是行为的抽象 ...
CS3L22——命名空间
CS3L22——命名空间
本章代码关键字
123namespace //命名空间关键字public //公开的类,可以被另外的工程调用internal //内部的类,不能被其他工程调用
命名空间
命名空间是用来组织和重用代码的
作用:就像是一个工具包,类就像是一件一件的工具,都是申明在命名空间中的
命名空间是个工具包 用来管理类,在不同命名空间中允许有同名类
不同命名空间中相互使用,需要引用命名空间或指明出处,命名空间可以可以包裹命名空间
命名空间的声明
命名空间可以分开写,甚至可以分成两个文件写,但是同一命名空间内不可以有同名类(分部类可以分开声明)
基本语法如下:
123456namespace 命名空间名{ class 类1 { ... } class 类2 { ... } // ...}
示例:
1234567891011namespace MyGame{ class GameObject { }}//命名 ...
CS3L23——object中的方法
CS3L23——object中的方法
本章代码关键字
12345678910//静态方法Object.Equals() //用来判断两个值是否相等,最终的判断权交给左侧对象的Equals成员方法(注意不是静态方法!)Object.ReferenceEquals() //比较两个对象是否是相同的引用,主要是用来比较引用类型的对象,值类型对象返回值始终是 false//成员方法object.GetType() //在运行时获取对象的类型object.MemberwiseClone() //该方法用于获取对象的浅拷贝对象,它会返回一个新的对象,新旧对象的引用类型成员都指向同一个数据//虚方法object.Equals() //默认实现还是比较两者是否为同一个引用,可以重写该方法,定义自己的比较相等的规则object.GetHashCode() //获取对象哈希码,可以通过重写该函数来自己定义对象的哈希码算法object.ToString() //用于返回当前对象代 ...
CS3L21——密封方法
CS3L21——密封方法
本章代码关键字
1sealed //让虚方法或者抽象方法之后不能再重写
密封方法
用密封关键字 sealed 修饰的重写函数
作用:让 虚方法 或者 抽象方法 之后不能再重写
特点:和 override 一起出现
实例
1234567891011121314151617181920212223242526272829abstract class Animal{ public string name; public abstract void Eat(); public virtual void Speak() { Console.WriteLine("叫"); }}class Person : Animal{ //密封后,之后的子类无法在重写这个函数 public sealed override void Eat() { } public override void Speak() ...
CS3L20——接口
CS3L20——接口
本章代码关键字
1interface //接口关键字
接口
接口是行为的抽象规范,它也是一种自定义类型,关键字:inferface
继承接口和继承类的区别
继承类 是对象间的继承 包括特征行为等
继承接口 是行为间的继承 继承接口的行为规范 按照规范去实现内容
由于接口也是遵循 里氏替换原则,所以可以用接口容器装对象,
那么就可以实现装载 各种毫无关系但是却有相同行为 的对象
接口内部只能包含成员方法、索引器、属性、事件,且都不实现,都没有访问修饰符,
类可以继承多个接口,但只能继承一个类
接口可以继承接口 相当于在进行行为合并 带子类继承时再去实现具体的行为
接口可以被显式实现 主要用于实现不同接口中的同名函数的不同表现
实现接口的方法 可以加 virtual 关键字 在之后的子类里重写
需要执行某种行为,就以行为对应的接口类型作为参数,传入拥有这种行为的对象(继承了对应接口的类对象)
这样,执行行为就不需要指定具体的类型,以摆脱对具体实现的依赖
因此实际开发中,建议多多使用接口抽象行为,通过接口类型变量接收具体类对象,通过接口调用方法
接口 ...
CS3L19——抽象类和抽象方法
CS3L19——抽象类和抽象方法
本章代码关键字
1abstract //抽象类和抽象方法的关键字
抽象类
抽象类就是,被抽象关键字 abstract 修饰的类
特点:不能被实例化的类,可以包含抽象方法,继承抽象类必须重写其抽象方法
作用:整体框架设计时会使用
注意:选择普通类还是抽象类,对于不希望被实例化的对象,相对比较抽象的类可以使用抽象类
父类中的行为不太需要被实现的,只希望在子类去定义具体的规则,可以选择,抽象类然后使用其中的抽象方法类定义规则
12345678910111213141516171819// 物品就是一种抽象的概念,它不是具体的物质,而是一个统称abstract class Thing{ //抽象类中 封装的所有知识点都可以在其中书写 public string name; //还可以抽象类中写抽象函数}class Water : Thing { }internal class Program{ static void Main(string[] args) { ...