1 什么是抽象类
例1(为作基类而生的“抽象类”与“开放/关闭原则”)
例2(纯抽象类)
例3 (将例2中纯抽象类修改为接口)
总结
·接口和抽象类都是“软件工程产物”
·具体类->抽象类->接口:越来越抽象,内部实现的东西越来越少
·抽象类是未完全实现逻辑的类(可以有字段和非public成员,它们代表了“具体逻辑”)
·抽象类为复用而生:专门作为基类来使用,也具有解耦功能
·封装确定的,开放不确定的,推迟到合适的子类中去实现
2 什么是接口
例1:未使用接口(契约)的例子
例2:使用接口的例子
例3:依赖与耦合
·紧耦合的例子(要尽量避免紧耦合)
例4:引入接口,降低耦合度
·松耦合的例子(利用接口降低耦合度)
总结
·如果有可以替换的地方,那么就会有接口的存在,接口就是为了松耦合而生(为了解耦而生)。松耦合的目的是使功能的提供方变得可替换,从而降低功能的提供方不能被替换所带来的高风险与高成本。
·接口是一个契约,约束一组功能,这组功能的调用者是被约束的(只能调用这个接口中所包含的功能),调用者可以放心调用,这些功能都是已经实现好了的,只需要关注功能,不需要关注功能的提供者
·接口是“供需双方”都要遵守的“契约”
·接口是完全未实现逻辑的“类”(“纯虚类”;只有函数成员;成员全部public)
·接口为解耦而生:“高内聚,低耦合”,方便单元测试
·接口是一个“协约”,早已为工业生产所熟知(有分工必有协作,有协作必有协约)
·它们都不能实例化,只能用来声明变量、引用具体类(concrete class)的实例
3 依赖反转原则与单元测试
·解耦在代码中的体现就是依赖反转
·单元测试其实就是依赖反转在开发中的直接应用和直接受益者
什么是依赖反转原则?
·依赖:服务的提供者和服务的使用者之间存在依赖关系,服务的使用者依赖在服务的提供者之上;依赖越直接,耦合就越紧密
·依赖反转原则:提供一种新的思路,用来平衡这种“自顶向下,逐步求精”的单一的思维方式(反转的是箭头)
例一(观察接口、解耦、依赖倒置原则是怎样被单元测试所应用的)
例二(利用接口将耦合松开,再用单元测试来测试Deskfan)
·测试项目
例三(利用moq直接创建实现接口方法的实例,而越过创建类的这一步骤)
与方法修饰符有关的图解
·存在一个接口,接口中有一个方法:
①如果想直接拿一个类来实现它,方法的修饰符为public
②如果要用抽象类来实现一个接口,方法的修饰符为public abstract
③如果用一个类来实现这个方法,并且想让这个方法可以被它的子类重写,方法的修饰符为public virtual
④被重写之后的方法的修饰符为public override
4 接口隔离原则
·接口隔离原则:服务调用者不能够多要
·把本质不同的功能隔离开,再用接口将其封装起来
例一:“胖接口”的示例(违反了接口隔离原则)
例二:将“胖接口”分裂成两个不同的接口
·这个例子符合接口隔离原则,因为在Driver类中,驾驶机动车只要求机动车可以跑,并不需要机动车发射炮弹,所以传进来的只是Vehicle,不会传进来任何多余的功能
例三:接口的显式实现(C#语言的独有功能)
例四:接口的显示实现
·接口中的方法不想轻易地被人调用,那么就不能够轻易被别人看到,就要用到接口的显示实现
5 反射
什么是反射?
·反射是.net框架的功能
·反射:以不变应万变(更松的耦合)
例一:反射的原理以及与反射密切相关的重要功能是依赖注入
例二:封装好了的反射的功能
·封装好了的反射最重要的功能就是依赖注入(DI)
·依赖注入需要借助依赖注入框架
例三
为什么使用反射?利用反射追求更松的耦合(即以不变应万变的能力)
·插件式编程:使用插件式编程,可以以主体程序为中心,生成生态圈(生态圈中有人不断更新主体程序,有人不断用插件增加新功能)
·主体程序与插件程序之间的关系:不变与万变的关系(当开发主体程序时,未来有多少人会开发出多少插件是不可能知道的)。一般来说,主体程序都会发布包含有程序开发接口(API)的程序开发包(SDK),第三方使用SDK中的API,在开发插件时就会比较容易,开发出的插件也会比较标准、高效的去跟主体程序对接
·程序开发接口(API)中不一定都是接口,有可能是一组函数、有可能是一组类
·使用反射时可以将耦合降低到忽略不计;为了避免第三方(插件开发者)犯小错误,就要用SD中的API约束开发者的开发,同时减轻开发者的劳动
与之相关的例子:
我是婴儿车的生产厂商(第一方程序员),婴儿车有一个面板,上面有按钮(动物和数字按钮),先点击动物,再点击数字,就会发出多少次该动物的叫声,我留一个USB的插口,其他厂商就可以把他们生产的包含更多动物的U盘插在婴儿车上,面板上就会出现更多的小动物。
6 .net core开发环境的搭建
目前最值得学习的C#开发平台已经由原来只能运行在windows上的.net Framework变成了开源的、跨平台的.net core。