什么是伪多态?在JavaScript当中显式伪多态和隐式伪多态指的是什么?

news2024/10/6 17:11:43

显式伪多态

显式伪多态 是在编程语言中通过非严格的多态性模拟多态行为的一种技术。在这种情况下,多态行为并不是通过经典的继承或接口机制实现的,而是通过一些显式的方法来模拟类似多态的效果。

显式伪多态的核心在于程序员显式地管理类型和行为,即通过代码判断类型并执行相应的操作,而不是让语言本身通过多态性自动处理不同类型的对象。这种方法模拟了多态的效果,但并不是正统的多态实现。

示例

在 JavaScript 中,假设我们有一个函数需要对不同类型的对象做不同的处理,我们可以通过类型检查来显式模拟多态行为。

function processAnimal(animal) {
  if (animal instanceof Dog) {
    animal.bark();
  } else if (animal instanceof Cat) {
    animal.meow();
  } else {
    console.log("Unknown animal");
  }
}

class Dog {
  bark() {
    console.log("Woof!");
  }
}

class Cat {
  meow() {
    console.log("Meow!");
  }
}

const dog = new Dog();
const cat = new Cat();

processAnimal(dog); // 输出: Woof!
processAnimal(cat); // 输出: Meow!

在这个例子中,我们通过 if-else 或者 switch 语句显式地模拟多态行为,这就是显式伪多态。程序员手动判断对象类型并调用相应的方法,而不是让编译器或运行时环境自动进行。

隐式伪多态

隐式伪多态 是指通过一些更加间接或隐晦的方式来模拟多态行为。与显式伪多态不同,隐式伪多态不会通过显式的类型判断(如 if 或 switch)来区分不同的类型,而是通过一些技术(如鸭子类型、动态方法绑定等)让对象能够在不严格要求类型匹配的情况下表现出多态性。

隐式伪多态其实与鸭子类型(duck typing)的概念紧密相关。在鸭子类型的语言中(如 JavaScript 和 Python),对象的行为和方法决定了它的“类型”,而不是对象本身的类层次结构。因此,当对象的接口契约满足调用的要求时,不需要做显式的类型检查或判断。

示例:鸭子类型的隐式伪多态

function processAnimal(animal) {
  if (typeof animal.sound === "function") {
    animal.sound();
  } else {
    console.log("This animal can't make a sound.");
  }
}

const dog = {
  sound() {
    console.log("Woof!");
  }
};

const cat = {
  sound() {
    console.log("Meow!");
  }
};

const fish = {
  swim() {
    console.log("Swim, swim");
  }
};

processAnimal(dog);  // 输出: Woof!
processAnimal(cat);  // 输出: Meow!
processAnimal(fish); // 输出: This animal can't make a sound.

在这个例子中,我们不关心对象的具体类型(如 Dog 或 Cat),只关心对象是否有 sound() 方法。如果有,调用它;没有,就处理异常情况。这就是鸭子类型的一种形式,也是隐式伪多态的一种表现形式。

显式伪多态与隐式伪多态的区别

显式伪多态

通过明确的类型检查和条件分支来模拟多态行为,程序员手动管理不同类型的处理逻辑。
优点:
明确清晰,程序员可以完全控制每种类型的行为。
缺点:代码容易膨胀,当需要支持的类型增加时,代码可维护性较差。

隐式伪多态

更加灵活,通常依赖于对象是否具有某些方法(鸭子类型)来决定行为,而不需要显式的类型检查。

优点:灵活性高,代码更加简洁,适合动态类型语言。
缺点:对于复杂系统,缺乏明确的类型约束可能导致潜在的错误较难排查。

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

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

相关文章

C++11之线程

编译环境:Qt join:阻塞当前线程,直到线程函数退出 detach:将线程对象与线程函数分离,线程不依赖线程对象管理 注:join和detach两者必选其一,否则线程对象的回收会影响线程的回收,导致…

MATLAB下的RSSI定位程序,二维平面上的定位,基站数量可自适应

文章目录 引言程序概述程序代码运行结果待定位点、锚点、计算结果显示待定位点和计算结果坐标 引言 随着无线通信技术的发展,基于 R S S I RSSI RSSI(接收信号强度指示)的方法在定位系统中变得越来越流行。 R S S I RSSI RSSI定位技术特别适…

Vue 插槽全攻略:重塑组件灵活性

前言 📫 大家好,我是南木元元,热爱技术和分享,欢迎大家交流,一起学习进步! 🍅 个人主页:南木元元 目录 什么是slot插槽 默认插槽 编译作用域 后备内容 具名插槽 作用域插槽 应…

医药行业的智能合同审查:大模型与AI赋能合规管理

随着医药行业的快速发展,尤其是在全球化背景下,企业在业务拓展、合作协议签订中需要处理大量复杂的合同。合同不仅是业务的法律保障,更是风险管理的重要工具。医药行业合同审查的复杂性源于其严格的合规性要求,包括与政府机构、研…

学会这几个简单的bat代码,轻松在朋友面前装一波13[通俗易懂]

大家好,又见面了,我是你们的朋友全栈君。 这个标题是干什么用的? 最近看晚上某些人耍cmd耍的十分开心,还自称为“黑客”,着实比较搞笑.他们那些花里胡哨的东西在外行看来十分nb,但只要略懂一些,就会发现他们的那些十…

数据库(MySQL):使用命令从零开始在Navicat创建一个数据库及其数据表(三),单表查询

前言 Navicat Premium 17 数据表需要经常清缓存,不然之前的自增的数据可能会一直存在,所以把之前的表删除重新创建是对练习数据库最简单的办法。新建数据库的命令如下: /* 创建有 自增主键的属性id,非空的属性name,唯…

如何使用ssm实现基于BS的超市商品管理系统的设计与实现+vue

TOC ssm787基于BS的超市商品管理系统的设计与实现vue 研究背景与现状 时代的进步使人们的生活实现了部分自动化,由最初的全手动办公已转向手动自动相结合的方式。比如各种办公系统、智能电子电器的出现,都为人们生活的享受提供帮助。采用新型的自动化…

TypeScript面向对象 02

抽象类 以abstract开头的类是抽象类。抽象类和其他类区别不大,只是不能用来创建对象。抽象类就是专门用来被继承的类。 抽象类中可以添加抽象方法。定义一个抽象方法使用abstract,没有方法体。抽象方法只能定义在抽象类中,子类必须对抽象方…

一些硬件知识(二十七)

单片机一般使用NOR FLASH ,这是因为NOR FLASH支持字节级的随机读取,可以直接运行存贮其中的程序,NOR FLASH支持读取和执行存储其中的指令,而无需将程序拷贝到RAM中才可执行。NAND FLASH适用于大容量的数据存储,他的读写…

【Canvas与标志】灰座橙底红芯辐射标志

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>灰座橙底红芯辐射标志</title><style type"text/css&q…

msvcp140.dll丢失的解决方法,详细解读6种解决方法

在使用电脑时&#xff0c;我们可能会遇到提示缺少msvcp140.dll的错误信息。这个提示意味着我们的电脑中缺少MSVCP140.dll这个文件&#xff0c;它是某些程序运行所必需的。如果我们遇到这个问题&#xff0c;应该如何解决呢&#xff1f;本文将详细解析如何解决msvcp140.dll丢失的…

qemu模拟arm64环境-构建6.1内核以及debian12

一、背景 手头没有合适的arm64开发板&#xff0c;但是需要arm的环境&#xff0c;于是想到qemu模拟一个。除了硬件交互以外&#xff0c;软件层面的开发还是都可以实现的。 虚拟机还能自定义内存大小和镜像大小&#xff0c;非常适合上板前的验证&#xff0c;合适的话再买也不迟。…

深度学习:5种经典神经网络模型介绍

目录 1. LeNet&#xff1a;CNN的鼻祖 2. AlexNet&#xff1a;深度学习的开山之作 3. VGGNet&#xff1a;深度与简洁的结合 4. GoogLeNet&#xff1a;Inception模块的创新 5. ResNet&#xff1a;残差学习的革命 卷积神经网络&#xff08;CNN&#xff09;已经发展为图像识别…

张雪峰谈人工智能技术应用专业的就业前景!

一、张雪峰谈人工智能技术应用专业 在教育咨询领域&#xff0c;张雪峰老师以其深入浅出的讲解和前瞻性的视角&#xff0c;为广大学子提供了宝贵的专业选择建议。对于人工智能技术应用专业&#xff0c;张雪峰老师通常给予高度评价&#xff0c;认为这是一个充满无限可能且就业前…

DELL SC compellent存储的四种访问方式

DELL SC存储&#xff08;国内翻译为 康贝存储&#xff0c;英文是compellent&#xff09;, compellent存储是dell在大概10多年前收购的一家存储&#xff0c;原来这个公司就叫做compellent。 本文的阅读对象是第一次接触SC存储的技术朋友们&#xff0c;如何访问和管理SC存储。总…

陀螺仪LSM6DSV16X与AI集成(13)----中断获取SFLP四元数

陀螺仪LSM6DSV16X与AI集成.13--中断获取SFLP四元数 概述视频教学样品申请源码下载硬件准备SFLP开启INT中断中断读取传感器数据主程序演示 概述 本文将介绍如何通过中断机制获取 LSM6DSV16X 传感器的 SFLP&#xff08;Sensor Fusion Low Power&#xff09;四元数数据。LSM6DSV1…

深入剖析 Golang 的错误处理机制:让你的代码更加健壮与优雅

在 Go 语言中&#xff0c;错误处理是程序健壮性的重要组成部分。不同于许多其他编程语言使用的 try-catch 异常处理机制&#xff0c;Go 采用了一种更加简洁的方式&#xff0c;通过函数返回值处理错误。这种设计使得错误处理逻辑更加显式&#xff0c;代码也更容易理解和维护。 文…

Python 工具库每日推荐 【markdown2】

文章目录 引言Python文本处理库的重要性今日推荐:markdown2工具库主要功能:使用场景:安装与配置快速上手示例代码转换为HTML代码解释实际应用案例案例:博客文章处理案例分析高级特性自定义扩展安全模式命令行使用性能优化技巧扩展阅读与资源优缺点分析优点:缺点:总结【 已…

Byzantine setting 拜占庭环境

优秀教程 拜占庭将军问题(The Byzantine Generals Problem): 拜占庭将军问题(The Byzantine Generals Problem) Byzantine setting 在联邦学习和分布式计算中&#xff0c;“Byzantine setting”&#xff08;拜占庭环境&#xff09;是指一个分布式系统中的部分参与者可能表现出…

SE-Net模型实现猴痘病识别

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色…