C#学习笔记(二十四)接口隔离、反射、特性、依赖注入

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

接口隔离

协议:甲方,我不会多要;乙方,我不会少给。

如何判断:就看,接口中是否有没有被调用到的函数成员。

接口隔离原则:接口调用者,不能多要。如果多要了,那么实现这个接口的类,其实也违反了单一职责原理。

单一职责原理:一个类只做一件事,或者只做一组相关的事。

接口隔离原则是站在服务调用者的角度看待问题,单一职责问题是站在服务提供者的角度来分析。

所以说接口隔离原则单一职责原理是同一个问题的两种描述。

如果出现了胖接口问题,那么我们就需要将胖接口拆分成多个小接口,每个小接口都是一个单一的功能。把本质不同的功能隔离开,这就是接口隔离原则的名称的由来。

如何实现?

通过一个接口对多个接口的继承来实现。将胖接口(一个接口由多个可拆分的功能函数成员组成)拆分成几个小接口。将多个函数成员,再分开放在多个接口中,细分。

类和类之间的继承,只能有一个基类,但是接口和接口之间的继承,可以多选。

但是在拆分时要把握一个度,一个平衡,过分拆解会使接口数目过多。最好是根据需要来分割。


接口隔离的例子

添加名称空间:

using System.Collections;

查看Array和ArrayList的定义。

两者都实现了ICollectionIEnumerable两个接口。

查看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类型的迭代器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值