乐趣区

关于后端:工作好多年有可能还未真正了解接口和抽象类

  1. 抽象类和接口的定义和区别?
  2. 抽象类在面向对象编程中解决了什么问题?
  3. 接口在面向对象编程中解决了什么问题?
  4. 如何决定该用抽象类还是接口?
  5. 如果应用的语言不反对抽象类和接口,该如何应答?

抽象类

在面向对象编程的语言中,少数都增加了对抽象类和接口的反对,比方最罕用的 java,C# 等语言。

    // 抽象类
    public abstract class Human
    {
        // 形象办法
        public abstract string Gender();
        // 属性
        public string Name {get; set;}
        // 办法
        public int GetAge()
        {return 1;}
    }

以上是一个一般的抽象类的定义,具体怎么应用,度娘有一大堆后果,其实总体来说抽象类次要有以下几点特色:

  1. 抽象类不能被实例化,只能被继承。也就是说如果 New Human()会报编译谬误
  2. 抽象类也是类,能够蕴含属性和办法,办法能够蕴含实现,也能够不蕴含,不蕴含实现被称为形象办法。
  3. 子类继承抽象类,必须要实现定义的所有形象办法,不然编译器会报编译谬误。

抽象类实质上还是类,只不过是一种不能被实例化的非凡类而已,然而在面向对象的设计过程中却起着十分重要的位置,实质上抽象类体现的是 is- a 的关系,就像上边定义的抽象类一样,Human 类型形象的是人类,如果我定义一个菜菜的类型来继承这个类型

 public class CaiCai : Human
    {public override string Gender()
        {return "男";}

    }

CaiCai 这个类必须要提供形象办法的实现才能够通过编译。抽象类的产生是面向对象开发思维的延长,是解决代码复用问题的一个计划,更是把代码进行抽象化的一个后果。抽象类的设计思维是自下而上的,也就是说设计上应该先有子类,当子类逐步减少,进而形象出共用个性而产生抽象类。

说到这里,好多同学会问,如果我不必抽象类做父类也能够啊。不错,一般的类当然也能够代替抽象类的位置。然而有几点就看起来比拟奇怪了

  1. 父类也能够进行实例化了,然而其中要形象的办法看起来就比拟怪了,因为这些办法只有子类中才有明确的定义,比方 以上代码中 Human 这个类如果批改为一般类型,那办法 Gender()该返回什么内容呢?
  2. 在编译期间,如果子类没有实现父类的办法是不会报错的,这就加大了排查问题的难度,如果须要重写的办法很多,之后排查问题会十分头疼
  3. 形象进去的父类如果能够被实例化,这实质上违反了面向对象的思维,毕竟父类是一个抽象化的概念,被实例化之后代表着什么比拟令人困惑

接口

接口在零碎设计中,最重要的作用就是解耦。你应该听过不止一次的“面向接口编程”和依赖倒置等思维,这些也是面向对象设计思维的一种体现。接口实质上是形象进去的对象的行为,或者叫做契约。在面向接口开发中,调用者不关怀接口的实现,而是依赖于接口的定义,接口定义的稳定性代表着一个零碎的稳定性,如果一个零碎对外的接口定义有问题,那这个零碎多半是会死人的。

    public interface IHuman
    {
        // 接口行为定义
        void Walk();}

以上只是一个简略接口的定义而已,接口的形象小到能够是一个对象的行为形象,大到能够是一个服务的行为形象,更有可能是一个零碎的行为形象,所以接口是一个很泛的概念,然而实质上还是反馈的是面向对象设计理念。因为接口是行为的定义,所以就决定了它有以下特点

  1. 接口只能定义行为,不能蕴含行为的实现
  2. 类型继承接口的时候,必须要实现接口的所有行为
  3. 接口不同于类,不能蕴含属性

因为接口体现的是行为准则,所以接口在定义的时候也能够利用面向对象设计理念,当多个不同接口定义了雷同的行为,能够思考形象出更下层的接口来实现行为的复用。

写在最初

抽象类和接口都是对象的形象行为产生的,只不过抽象类更加侧重于 is-a 的关系,它实现了代码复用,而接口更加侧重于行为的形象(has -a), 举一个很简略的栗子,如果设计一个鸟类的形象该怎么做呢?不同的鸟可能羽毛的色彩不一样,像这样的属性能够利用抽象类,不同的鸟类可能会有不同的航行行为,这样行为类的形象利用接口来实现更加适合。

无论是接口还是抽象类,在代码档次上体现的是上下级关系,就算一个编程语言没有提供接口和抽象类的定义,只有能实现对象上下级关系,原理上也能够实现面向对象编程。编程的形象思维始终在围绕着高低,内外这几个维度在正当的进化着。

说到接口的定义,其实还能够在泛化一下,接口中只有行为办法的定义,在一些不反对接口的编程语言中,能够把只蕴含办法的类看做接口的形象定义,这在设计理念上是说的通的。

在继承档次上和设计流程上,抽象类是一种自下而上的设计思路,先有子类的代码,当子类逐步增多,才会形象出更加下层的父类。而接口不同,面向接口编程是一种自上而下的设计思路,先形象出行为契约,而后才是实现。

更多精彩文章

  • 分布式大并发系列
  • 架构设计系列
  • 趣学算法和数据结构系列
  • 设计模式系列

退出移动版