【C#学习】29(01)接口隔离,反射

接口隔离原则

接口隔离原则:Interface Segregation Principle,ISP
定义:

  • 客户端不应该依赖它不需要的接口
  • 类间的依赖关系应该建立在最小的接口上

也就是说:不要在一个接口里面放很多的方法,这样会显得这个类臃肿不堪。接口应该尽量细化,一个接口对应一个功能模块,同时接口里面的方法应该尽可能的少,使接口更加轻便灵活。

但要注意区分【接口隔离原则】和【单一职责原则】,在两个原则有着很鲜明的区别,它们的的审视角度是不同的,单一职责原则要求类和接口职责单一,注重的是职责,是业务逻辑上的划分;而接口隔离原则要求方法要尽可能的少,是在接口设计上的考虑。

例如一个接口的职责包含10个方法,这10个方法都放在一个接口中,并且提供给多个模块访问,各个模块按照规定的权限来访问,并规定了“不使用的方法不能访问”,这样的设计是不符合接口隔离原则的,接口隔离原则要求“尽量使用多个专门的接口”,这里专门的接口就是指提供给每个模块的都应该是单一接口(即每一个模块对应一个接口),而不是建立一个庞大臃肿的接口来容纳所有的客户端访问。

违反接口隔离原则的后果

1.导致实现该接口的类,同时违反单一职责原则

2.导致把合格的功能提供者挡在门外

例1:开坦克的女生

女生开车在路上追尾了,她的男朋友安慰她说,别哭啦,赶明儿给你买架坦克你上路开!
(1)设计失误,把太多功能放在一个接口中,而调用者根本就用不到;而且会把合格的功能提供者挡在门外
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(2)按照接口隔离原则,把大接口拆分成小接口
在这里插入图片描述
在这里插入图片描述

例2:对一组整数求和

(1)对一组整数求和
在这里插入图片描述

(2)ICollection,IEnumerable
在这里插入图片描述
在这里插入图片描述
只需要功能的提供者——传进求和函数的数组,具有能被迭代的功能即可,也就是说,只要求它实现【IEnumerable接口】,并不需要实现【ICollection接口】

(3)声明一个【ReadOnlyCollection】
声明【ReadOnlyCollection类】只读集合,它只实现【IEnumerable接口】,只能被迭代
在这里插入图片描述
在这里插入图片描述

(4)具体实现
在这里插入图片描述
在这里插入图片描述
(5)传入一个大接口
在这里插入图片描述

显式地实现接口

显式地实现接口是C#所独有的功能,C#在接口隔离方面做得比其他任何一种语言都要出色;它不但能让我们做到接口隔离,还能把一些隔离出的接口隐藏起来,直到显式地用接口类型的变量,去引用一个实现了该接口的类的具体实例时,这个接口中的方法才能被我们所看到,所调用

例3:这个杀手不太冷

杀手走在街上,不能轻易地让别人看出他是一个杀手
在这里插入图片描述
在这里插入图片描述

反射

什么是反射?

反射机制指的是程序在运行时能够获取自身的信息,只要给定类的名字,就可以通过反射机制来获得类的所有信息
也就是说:给我一个对象,我在不知道它具体是什么静态类型,且不用new操作符的情况下,能创建出一个同类型的对象,还能访问对象的成员

为什么需要反射?

为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念

  • 静态编译:在编译时确定类型,绑定对象,即通过。

  • 动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,以降低类之间的藕合性。

  • 反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性

    比如,一个大型的软件,不可能一次就把把它设计的很完美,当这个程序编 译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能的更新,而采用反射机制的话,它就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现该功能。

  • 它的缺点是对性能有影响。

反射的原理

在这里插入图片描述

参考资料

接口隔离原则
Java反射机制详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值