接口与抽象类的区别

介绍

开闭原则

开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。

抽象类

概述: 在面向对象的概念中,所有的对象都是通过类来描绘的。而当需要更多信息来 描述/确定 一个具体的、符合应用场景的对象时,就需要 推迟 确定具体的实现。抽象类 主要针对实体抽象
特点: 抽象类 是一个 未完全实现逻辑 的类,类中可以同时具有 具体实现逻辑抽象逻辑

  • 具体实现逻辑:具体实现方法,成员变量,静态方法等等
  • 抽象逻辑:抽象方法

总结: 具体实现逻辑 提高复用性 ,抽象逻辑 降低耦合 ;抽象类封装确定的,开放不确定的,推迟到合适的子类中去实现

接口

概述: 接口由抽象类进化而来的,可以看作一种契约(协议),约束着服务的生产者和消费者。接口 主要针对动作(方法)抽象
特点: 接口 是一个 完全未实现逻辑 的“类”,只具有 抽象逻辑

  • 抽象逻辑:接口中全都是抽象方法
  • 抽象方法的访问修饰符必须为 public ,因为这标志着对服务的消费者和生产者双方都可见,体现“契约”这个概念

总结: 接口是一种“契约”,将具有共性动作(方法)的类抽象成接口,由接口派生出实现类,减少类之间的依赖带来的紧耦合。借用接口,自底向上完成重构,自顶向下完成设计

区别

设计层面

  • 抽象类 是一个 未完全实现逻辑 的类;接口 是一个 完全未实现逻辑 的“类”
  • 抽象类针对实体抽象;接口针对动作抽象
  • 抽象类和接口都能解耦。抽象类主要为了 复用 ;接口主要为了 解耦 ,相比抽象类解耦更彻底和强力

使用层面

  • 对于一个派生类来说。 抽象类只能被 单继承 ;接口可以被 多实现
  • 抽象类中能有成员变量、具体实现方法、抽象方法等等;接口只能有抽象方法(Java中能有常量)
  • 抽象类中除了抽象方法不能private,其他的成员变量或方法访问修饰符随意;接口中的抽象方法访问修饰符全部为public的
  • 有抽象方法的类必须定义为抽象类,抽象类不一定有抽象方法
  • 抽象类除了涉及抽象有关的部分,和 普通java/C#类 定义基本一致

你可能感兴趣的:(接口与抽象类的区别)