抽象类和接口比较总结

前面提到面试中关于“网站应对高负载”的总结,今天来总结一下抽象类和接口的比较

抽象类和接口相对于我们开发者都很熟悉,但是平常不怎么去纠结这里的内涵,而如何去比较抽象类和接口却是在面试中十有八九会遇到的问题,看似简单,但真正问到的时候,却显得词穷,只能用那么一两句话来概括一下。
参考知乎里的文章接口和抽象类有什么区别? ,在这里做一下简单的总结

共性

  1. 都是上层的抽象层
  2. 都不能被实例化
  3. 都包含抽象方法 (抽象方法没有方法体,需要被实现,不能定义为private)

区分

  1. 在抽象类中可以写非抽象的方法,从而避免在子类中重复书写他们,这样可以提高代码的复用性,这是抽象类的优势;接口中只能有抽象的方法
  2. 一个类只能继承一个直接父类,这个父类可以是具体的类也可是抽象类;但是一个类可以实现多个接口(子类继承抽象类需要实现抽象方法,只要有一个抽象方法没有实现就仍然要声明为抽象类;子类实现接口需要实现需要所有方法或者子类声明为抽象类和把接口中未实现的方法定义为抽象方法;接口可以继承接口;C++是可以实现类的多继承的,php和java是单继承,多继承要处理复杂的重复变量和方法问题)
  3. 抽象类和方法要加abstract来修饰
  4. 类是对具体事物的抽象,封闭的是具体事物的固有属性;接口是对动作的抽象,不同的类可以实现接口中的动作方法(这个问题当时面试官问为什么不直接用抽象类的继承和实现,还要用接口。当时回答这个问题 的时候有点哽咽)
  5. 接口更多用来做契约,即规范约束
abstract class A {
     abstract   public function method1();
     abstract   public function method2();
}

interface M {
        public function method1();
        public function method2();
}

class N implements M {
        public function method1(){echo 'method1';}
        public function method2(){echo 'method2';}
}

$n = new N;
$n->method1();
$n->method2();

abstract class B implements M {
        public function method1(){echo 'B method1';}
        abstract public function method2();

}

class C extends B {

        public function method2(){echo 'method2';}
}
$c = new C();
$c->method1();
$c->method2(); 

以上是我的个人理解,欢迎大家指点补充,好让我有机会对面试官进行回怂-_-

雪花飘
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3
Atzcl

语塞 不是 哽咽 吧 :laughing:

6年前 评论

这篇文章洗的很好

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!