美文网首页
面向对象(五)

面向对象(五)

作者: 凯玲之恋 | 来源:发表于2020-04-09 22:18 被阅读0次

    在面向对象编程中,抽象类和接口是两个经常被用到的语法概念,是面向对象四大特性,以及很多设计模式、设计思想、设计原则编程实现的基础。

    不过,并不是所有的面向对象编程语言都支持这两个语法概念,比如,C++ 这种编程语言只支持抽象类,不支持接口;而像 Python 这样的动态编程语言,既不支持抽象类,也不支持接口。

    尽管有些编程语言没有提供现成的语法来支持接口和抽象类,我们仍然可以通过一些手段来模拟实现这两个语法概念。

    1 抽象类与接水口的区别

    1.1 java 如何定义抽象类的。

    • 抽象类不允许被实例化,只能被继承
    • 抽象类可以包含属性和方法。方法既可以包含代码实现,也可以不包含代码实现。不包含代码实现的方法叫作抽象方法。
    • 子类继承抽象类,必须实现抽象类中的所有抽象方法。

    1.2 java 如何定义接口。

    • 接口不能包含属性(也就是成员变量)。
    • 接口只能声明方法,方法不能包含代码实现。
    • 类实现接口的时候,必须实现接口中声明的所有方法。

    1.3 区别

    • 抽象类实际上就是类,只不过是一种特殊的类,这种类不能被实例化为对象,只能被子类继承。
      继承关系是一种 is-a 的关系,那抽象类既然属于类,也表示一种 is-a 的关系。
    • 接口表示一种 has-a 关系,表示具有某些功能。对于接口,有一个更加形象的叫法,那就是协议(contract)。

    2 抽象类和接口能解决什么编程问题?

    2.1 抽象类

    • 抽象类不能实例化,只能被继承。
      继承能解决代码复用的问题。
      多个子类可以继承抽象类中定义的属性和方法,避免在子类中,重复编写相同的代码。
    • 编译器会强制要求子类重写 log() 方法

    抽象类可以更优雅的实现多态。

    2.2 接口

    • 抽象类更多的是为了代码复用,而接口就更侧重于解耦
    • 接口是对行为的一种抽象,相当于一组协议或者契约,
    • 调用者只需要关注抽象的接口,不需要了解具体的实现,具体的实现代码对调用者透明。接口实现了约定和实现相分离,可以降低代码间的耦合性,提高代码的可扩展性。

    3 如何决定该用抽象类还是接口?

    • 如果我们要表示一种 is-a 的关系,并且是为了解决代码复用的问题,我们就用抽象类;

    • 如果我们要表示一种 has-a 关系,并且是为了解决抽象而非代码复用的问题,那我们就可以使用接口。

    • 从类的继承层次上来看,抽象类是一种自下而上的设计思路,先有子类的代码重复,然后再抽象成上层的父类(也就是抽象类)。

    • 接口正好相反,它是一种自上而下的设计思路。

    • 我们在编程的时候,一般都是先设计接口,再去考虑具体的实现。

    参考

    08 | 理论五:接口vs抽象类的区别?如何用普通的类模拟抽象类和接口?

    相关文章

      网友评论

          本文标题:面向对象(五)

          本文链接:https://www.haomeiwen.com/subject/ddwfmhtx.html