接口隔离
协议:甲方,我不会多要;乙方,我不会少给。
如何判断:就看,接口中是否有没有被调用到的函数成员。
接口隔离原则:接口调用者,不能多要。如果多要了,那么实现这个接口的类,其实也违反了单一职责原理。
单一职责原理:一个类只做一件事,或者只做一组相关的事。
接口隔离原则是站在服务调用者的角度看待问题,单一职责问题是站在服务提供者的角度来分析。
所以说接口隔离原则和单一职责原理是同一个问题的两种描述。
如果出现了胖接口问题,那么我们就需要将胖接口拆分成多个小接口,每个小接口都是一个单一的功能。把本质不同的功能隔离开,这就是接口隔离原则的名称的由来。
如何实现?
通过一个接口对多个接口的继承来实现。将胖接口(一个接口由多个可拆分的功能函数成员组成)拆分成几个小接口。将多个函数成员,再分开放在多个接口中,细分。
类和类之间的继承,只能有一个基类,但是接口和接口之间的继承,可以多选。
但是在拆分时要把握一个度,一个平衡,过分拆解会使接口数目过多。最好是根据需要来分割。
接口隔离的例子
添加名称空间:
using System.Collections;
查看Array和ArrayList的定义。


两者都实现了ICollection和IEnumerable两个接口。
查看Icollection接口定义;

发现它比IEnumerable除了可以被迭代以外,还多了几个功能。Count知道里面有多少个元素,CopyTo将里面的元素复制到一个数组里面去。
引用之前的例子,两个数组都想求和。当时选用的是两者抽象出的接口IEnumerable。如果改成ICollection。如何。结果与原来的一致。
static void Main(string[] args)
{
int[] nums1 = new[] { 1, 2, 3, 4, 5, 6, 7 };
ArrayList nums2 = new ArrayList { 1, 2, 3, 4, 5, 6, 7 };
Console.WriteLine(Sum(nums1));
Console.WriteLine(Sum(nums2));
}
static int Sum(ICollection nums)
{
int sum = 0;
foreach (var n in nums)
{
sum += (int)n;
}
return sum;
}
对于我们的来说,只要IENumerable,就够了,我们并不需要ICollection提供的那么多功能。
那么问题:有没有那么一种集合:只实现了IEnumerable接口,不需要ICollection接口?
C#中没有,但是我们可以自己定义一个。
class ReadOnlyCollection : IEnumerable
{
// 继承接口,当外界迭代实例的时候,需要返回一个IEnumerator迭代器。
public IEnumerator GetEnumerator()
{
throw new NotImplementedException();
}
}
我们的类继承了IEnumerable,需要实现接口,那么当迭代实例的时候,需要返回一个IEnumerator类型的迭代器。

本文讲解了接口隔离原则,单一职责原理以及依赖反转原则,并通过C#代码示例介绍了接口隔离的实际应用,同时探讨了依赖注入的概念及其实现。
最低0.47元/天 解锁文章
1759

被折叠的 条评论
为什么被折叠?



