【面试题01】抽象类、接口 的区别和使用场景

news2024/10/7 8:30:03

文章目录

  • 一、抽象类和接口的区别
    • 1.1 定义方式不同
    • 1.2.成员方法不同
    • 1.3 实现方式不同
    • 1.4 构造方法不同
    • 1.5 访问修饰符不同
    • 1.6 关注点不同
  • 二、抽象类和接口的使用场景
    • 2.1 抽象类的使用场景
    • 2.2 接口的使用场景
  • 三、PHP代码演示
  • 总结


一、抽象类和接口的区别

抽象类和接口基本上是面试必问的一个问题,因为用的实在是太普遍了,用好抽象类和接口是开发者必备的技能。但是真正用好二者确实不太容易。抽象类和接口是面向对象编程中的两个核心概念,它们旨在帮助开发者更好地组织和管理代码,并提高代码的可维护性和可扩展性。在本文中,我们将详细介绍抽象类和接口的区别和使用场景,并通过PHP语言给出代码演示。

1.1 定义方式不同

抽象类是使用关键字abstract来定义的,而接口是使用关键字interface来定义的。

1.2.成员方法不同

抽象类可以包含普通方法和抽象方法,而接口只能包含抽象方法。

1.3 实现方式不同

抽象类可以被继承,子类可以继承父类的属性和方法,并且必须实现父类中的抽象方法。而接口则不能被继承,它只能被实现,实现了接口的类必须实现接口中所有的抽象方法。

1.4 构造方法不同

抽象类可以包含构造方法,而接口不可以。

1.5 访问修饰符不同

抽象类中的成员方法可以包含public、protected和private三种访问修饰符,而接口中的成员方法只能包含public访问修饰符。

1.6 关注点不同

抽象类强调“是不是”,主要用于定义一些基础类,而接口强调“能否”,主要用于定义一些可替换的类或行为。

在这里插入图片描述

二、抽象类和接口的使用场景

2.1 抽象类的使用场景

抽象类通常用于定义一些基础类,它们的主要作用是为派生类提供公共的基础方法和属性。抽象类可以包含普通方法和抽象方法,其中普通方法可以提供默认实现,而抽象方法则需要子类去实现。除此之外,抽象类还可以包含protected和private成员变量和方法,以及构造方法。下面是一个用抽象类定义的基础类的例子:

abstract class Shape{
    protected $color;
    
    public function setColor($color){
        $this->color = $color;
    }
    
    abstract public function getArea();
}

class Circle extends Shape{
    protected $radius;
    
    public function __construct($radius){
        $this->radius = $radius;
    }
    
    public function getArea(){
        return pi()*pow($this->radius,2);
    }
}

class Rectangle extends Shape{
    protected $width;
    protected $height;
    
    public function __construct($width,$height){
        $this->width = $width;
        $this->height = $height;
    }
    
    public function getArea(){
        return $this->width*$this->height;
    }
}

在上面的例子中,我们用抽象类Shape定义了一个基础图形类,其中包含了protected属性$color和abstract方法getArea()。然后我们用Circle和Rectangle来继承Shape,并实现了getArea()方法。

2.2 接口的使用场景

接口通常用于定义一些行为规范,它们的主要作用是约束各个实现类的行为,从而提高程序的可扩展性和可替换性。接口只包含抽象方法,没有属性和方法的实现。下面是一个用接口定义的日志记录器的例子:

interface Logger{
    public function log($msg);
}

class FileLogger implements Logger{
    public function log($msg){
        //将日志写入文件
    }
}

class DatabaseLogger implements Logger{
    public function log($msg){
        //将日志写入数据库
    }
}

在上面的例子中,我们用接口Logger定义了一个日志记录器的规范,其中只包含一个抽象方法log()。然后我们用FileLogger和DatabaseLogger来实现Logger,并实现了log()方法。

三、PHP代码演示

下面是一个通过抽象类Shape和接口Logger来实现一个图形绘制和日志记录的例子:

abstract class Shape{
    protected $color;
    
    public function setColor($color){
        $this->color = $color;
    }
    
    abstract public function getArea();
}

interface Logger{
    public function log($msg);
}

class Circle extends Shape{
    protected $radius;
    
    public function __construct($radius){
        $this->radius = $radius;
    }
    
    public function getArea(){
        return pi()*pow($this->radius,2);
    }
}

class Rectangle extends Shape{
    protected $width;
    protected $height;
    
    public function __construct($width,$height){
        $this->width = $width;
        $this->height = $height;
    }
    
    public function getArea(){
        return $this->width*$this->height;
    }
}

class Canvas{
    private $shapes = [];
    
    public function addShape(Shape $shape){
        $this->shapes[] = $shape;
    }
    
    public function draw(Logger $logger){
        foreach($this->shapes as $shape){
            $area = $shape->getArea();
            $logger->log("The area of shape is ".$area);
        }
    }
}

class FileLogger implements Logger{
    
    private $filename;
    
    public function __construct($filename){
        $this->filename = $filename;
    }
    
    public function log($msg){
        file_put_contents($this->filename,$msg."\n",FILE_APPEND);
    }
}

$circle = new Circle(5);
$circle->setColor('red');

$rectangle = new Rectangle(10,20);
$rectangle->setColor('blue');

$canvas = new Canvas();
$canvas->addShape($circle);
$canvas->addShape($rectangle);

$logger = new FileLogger('log.txt');

$canvas->draw($logger);

在上面的例子中,我们定义了一个抽象类Shape和一个接口Logger,并用Circle和Rectangle来继承Shape,FileLogger来实现Logger。然后我们通过Canvas类来实现图形绘制,并且记录日志。在最后,我们创建了一个FileLogger对象来将日志写入到文件中。

总结

通过以上的例子,我们可以看出抽象类和接口在代码中的作用和使用场景。抽象类用于定义一些基础类,而接口用于定义一些行为规范。它们都是为了让代码更加模块化、可维护和可扩展。因此,在实际开发中,我们应该根据业务需求合理地使用抽象类和接口,以提高代码质量和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/669526.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

提升效率,使用ChatGPT的轻松撰写日报和周报

日报和周报是办公生活中不可或缺的部分,它们有助于记录工作进展、分享关键信息和与团队保持沟通。但是,有时写作这些报告可能会变得繁琐和耗时。在本文中,我们将介绍如何利用ChatGPT,一个强大的自然语言处理模型,提高写…

安卓开发级联显示菜单-省市区显示举例

安卓开发级联显示菜单-省市区显示举例 问题背景 安卓日常开发过程,经常会有需要级联显示的场景,比如省市区显示等,或者各种组织结构级联显示,本文将介绍安卓开发过程实现级联显示的一种方案。 实现效果如下: 问题分…

GaussDB整体性能慢分析

目录 问题描述问题现象告警业务影响原因分析分析步骤分析定位方法步骤一步骤二步骤三步骤四CPU满I/O满或者I/O异常内存满网络异常 步骤五并发问题数据库配置问题异常等待事件长时间性能下降短时性能抖动不优SQL 问题描述 整体性能慢。不满足客户作业对时延要求或者不满足客户预…

微信小程序 u-picker 三级联动 uView

微信小程序 u-picker 三级联动 uView 场景 移动端微信小程序框架 uView 中的 u-picker 实现三级联动 数据是一级一级加载的 [12,1201,120101] 多列联动 先了解属性参数 mode可以设置为:time、region、selector、multiSelector,区分时间、地区、单列&am…

2022高教社杯全国大学生数学建模竞赛B题解析(更新完结)

2022高教社杯全国大学生数学建模竞赛B题解析(更新完结) 题目解析前言问题一1.11.21.3问题二 题目 B 题 无人机遂行编队飞行中的纯方位无源定位 无人机集群在遂行编队飞行时,为避免外界干扰,应尽可能保持电磁静默,少向…

LC-LCP 41. 黑白翻转棋

LCP 41. 黑白翻转棋 难度中等32 在 n*m 大小的棋盘中,有黑白两种棋子,黑棋记作字母 "X", 白棋记作字母 "O",空余位置记作 "."。当落下的棋子与其他相同颜色的棋子在行、列或对角线完全包围(中间不…

Kotlin 一劳永逸实现 TAG

1 TAG 经典写法 对于 Android 开发,当我们需要在类中打印 Log 时,通常在Java中会这么定义一个 TAG: private static final String TAG "TestClass"; 或者不具体指定名字: private static final String TAG TestClass.…

Java粮油质量管控防伪溯源系统源码 粮油MES源码

Java粮油质量管控防伪溯源系统源码, 粮油MES源码,有演示,有源码。 一、全生命周期的追踪与溯源 (1)通过一物一码管理生产销售、追踪包装关联,配送管理及终端查询来实现窜货预警,及时处理问题&…

(一)rstudio容器用户配置root权限,安装conda

1、查看运行中的容器:docker ps 2、进入容器:docker exec -it my_rstudio /bin/bash 3、安装工具:apt-get install 4、查看权限配置文件:cat /etc/sudo 5、查看确认用户(rstudio):cat /etc/passwd | cut -d: -f1 ro…

判断给定数据中是否存在True只要存在一个True结果为Turenp.sometrue()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 判断给定数据中是否存在True 只要存在一个True结果为Ture np.sometrue() 选择题 下列说法错误的是? import numpy as np a np.array([False, False, True]) print("【显示】a "…

三年时间打磨,MeterSphere v2.10 LTS版本给测试用户带来的价值

2023年5月,MeterSphere开源持续测试平台(https://github.com/metersphere)发布了v2.10 LTS版本。这是这个开源项目自2020年2月写下第一行代码后发布的第三个LTS版本。 在软件行业,LTS(即Long Term Support&#xff09…

SQL太慢如何进行优化

1.慢SQL优化思路。 慢查询日志记录慢SQL explain分析SQL的执行计划 profile 分析执行耗时 Optimizer Trace分析详情 确定问题并采用相应的措施 1.1 慢查询日志记录慢SQL 如何定位慢SQL呢、我们可以通过慢查询日志来查看慢SQL。默认的情况下呢,MySQL数据库是不开…

C盘文件恢复怎么做?数据恢复,就看这4招!

我一般比较重要的文件都会保存到c盘中。最近电脑有点卡顿,想清理一下不需要的文件,但不小心删除了一个很重要的文件,c盘删除的文件还能恢复吗?谁可以帮我想想c盘中的文件如何恢复呢? C盘对于电脑来说是个很重要的磁盘&…

Linux教程——Vim移动光标快捷键汇总

Vim 文本编辑器中,最简单的移动光标的方式是使用方向键,但这种方式的效率太低,更高效的方式使用快捷键。 Vim 移动光标常用的快捷键及其功能如下面各表所示,需要注意的是,表中所有的快捷键都在命令模式(默…

安卓蓝牙L2CAP协议简介及报文格式

概述 逻辑链路控制和适配协议(Logical Link Control and Adaptation Protocol,L2CAP)是蓝牙的核心协议,负责适配基带中的上层协议。它同链路管理器并行工作,向上层协议提供定向连接的和无连接的数据业务。L2CAP具有分…

彻底理解SQL中的JOIN

数据准备 -- 建表语句 CREATE TABLE tbl_dept (id int(11) NOT NULL AUTO_INCREMENT,deptName varchar(30) DEFAULT NULL,locAdd varchar(40) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETutf8;CREATE TABLE tbl_emp (id int(11) NOT NULL …

【运维知识进阶篇】zabbix5.0稳定版详解4(用脚本自定义监控项+监控MySQL状态信息)

我们在做自定义监控项的时候,一个一个取比较麻烦,取出一个数值,就要把该数值相关信息以一定格式写入/etc/zabbix/zabbix_agentd.d/下的配置文件里,当遇到需要取很多数值的时候,这样的操作会很繁琐,当有一种…

前端程序员必须要知道的跨域问题以及解决方法

大厂面试题分享 面试题库 前后端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 web前端面试题库 VS java后端面试题库大全 前言 前端程序员必须要知道的跨域问题以及解决方法 node 代理 原理 同源策略发生在浏览…

基于Java+socket实现多线程聊天室-控制台版

基于Javasocket实现多线程聊天室-控制台版 一、系统介绍二、功能展示1.运行效果 三、代码展示四、其它1.其他系统实现2.获取源码 一、系统介绍 首先启动server端,然后启动client端。任意一个client发送给server的消息都将会被转发给所有在线的client,实…

C++基础(16)——STL常用算法(排序、拷贝和集合)

前言 本文介绍了C中STL常用排序、拷贝和集合算法 9.3:常见的排序算法(sort、random_shuffle、merge、reverse) 9.3.1:sort 9.3.2:random_shuffle 将容器中的数据位置重新打乱,可以配合随机数种子使用 9…