任何人都可以举例说明为什么在代码重用,松散耦合和扩展方面接口与抽象类的原因。多态?

时间:2014-10-04 05:37:33

标签: interface polymorphism abstract-class encapsulation loose-coupling

对这个问题进行了几次讨论。但我正在寻找一个令人满意的答案,就下面的oops概念而言。 一个。代码重用 湾松耦合 C。多态性 如果任何人可以解释(使用上面指定的技术的一些例子)当使用接口和使用抽象类时

1 个答案:

答案 0 :(得分:1)

松散的耦合意味着封装的组件足够了解彼此以完成工作 - 仅此而已。对于系统而言,它是一个很好的属性,因为松散耦合的组件可以改变其实现,而对系统的其他相关组件几乎没有影响。这增加了系统的可维护性。

让我们以Iterator为例。 Iterator是一个允许逐个元素遍历容器的对象。 Iterator可能有很多实现:

  1. List Iterator
  2. Vector Iterator
  3. Stack Iterator
  4. Linked List Iterator
  5. 队列迭代器
  6. 所有实施方式都与其运营的容器有所不同。但是迭代器的概念保持不变 - 它是一种逐个元素遍历容器的方法,而不必知道容器实现的细节。您可以说Iterator接口是遍历容器的抽象。

    它松散耦合,因为容器实现的细节与遍历元素的方式无关。使用Iterator的客户端不必了解Container的实现方式,反之亦然。

    以下是Iterator接口的示例:

    public interface Iterator { 
         public bool HasNext { get; set;}
         public object Next();
    }
    

    然后,您可以开发依赖于迭代器抽象的算法。例如,您可以实现一个反向算法,该算法遍历容器并反转序列:

    public IList<int> Reverse(Iterator iter) {
        var list = new List<int>();
        while (iter.HasNext) {
           list.Insert(0, iter.Next());
        }
        return list;
    }
    

    反向算法的这种实现不知道Iterator所基于的容器(它并不关心)。它可以是StackIterator,VectorIterator等。

    您可以通过返回Iterator而不是IList来进一步重构实现:

    public Iterator Reverse(Iterator iter) {
        var list = new List<int>();
        while (iter.HasNext) {
           list.Insert(0, iter.Next());
        }
        return new ListIterator(list);
    }
    

    然后算法的调用者不必依赖于IList接口 - 再次,松散耦合是这里的目标。

    接口与抽象类与混凝土类

    这是一个更抽象,更少抽象的光谱,换句话说,更松散地耦合到更紧密的耦合。

    使用上面的示例进行迭代器抽象,我们将得到以下谱:

    Iterator&lt; - &gt; BaseIterator&lt; - &gt; VectorIterator

    Iterator是一个接口 - 它是最抽象的并暴露了最少的实现细节,因此它与使用它的类最不相关

    Base Iterator是一个抽象类 - 它有一个部分实现,实现类将提供其余的实现,使用它的类依赖于抽象类(或部分实现)。

    VectorIterator是一个具体的类 - 它有一个完整的实现。使用它的类依赖于具体的实现,因此与使用它的类有更紧密的耦合。

    真实世界类比

    这是一个类比。假设您是一名员工,并且即将要求您的雇主加薪。这不是任何员工第一次要求他/她的经理加薪 - 这已经被无数其他人多次完成了。假设有一个总体策略要求加薪(不要乞讨),以最大限度地提高你成功的机会。如果您了解该策略,那么您可以将其应用于任何经理,并在整个职业生涯中取得相应的成功。这是松散耦合设计的一个例子。员工(任何员工)与经理(任何经理)互动,目的是要求加薪。你可以将经理A换成经理B,你成功的机会仍然高于平均水平。

    现在考虑一下,员工碰巧知道一个特定的策略,而不是一般的策略,这个策略会对你现任的老板(约翰A.史密斯先生)有所帮助,因为有传言说他会听到他更加和蔼可亲。这是紧耦合设计的一个例子。员工(琼斯先生)与特定经理(史密斯先生)互动,目的是要求加薪。您无法与经理B交换经理A,并期望您的成功机会是相同的,因为您的策略可能只适用于史密斯先生。

    在可重用性方面,第一种策略比第二种策略更易于使用。知道为什么吗?