设计心得——多态

news2025/3/16 6:38:31

一、设计上的多态

无论是在网上还是书籍上,还是自己的文章里都反复分析过多态的原理、应用和各种常见的情况。本篇重点从设计的角度来阐述一下多态,而不对多态的具体的用法进行说明。在前面的知识学习中可以知道,多态可以分为动多态和靜多态,有很多种实现的方式。而这种实现方式的不同,其实恰恰是给设计者提供了一种设计上的思路。

二、多态在设计上的展开

1、普通多态 (动多态 )
无论是在常见的学习中的多态的用法还是普通模板中的多态的用法,它们其实都是可以归为动多态这一类。动多态有虚表,有虚指针,需要迟后联编。它的应用上更灵活,也更容易为开发者理解。一般开发者接触到继承后,就可以对这种多态进行学习和应用了。
2、特殊多态(静多态 )
多态其实还有一些特殊情况,一个是通过模板或宏来模拟实现多态(注意区别普通多态中的模板中的多态应用)。另外一个就是前面提到CRTP的多态的应用。它们这一类基本上可以归到静多态这一类上。因为它不同于初学者学到的多态的情况,所以也称为特殊多态。这一类多态其实从严格意义上来讲只是实现了多态的效果。

掌握多态的实现和原理需要开发者自己认真的学习相关的技术,而设计者更多的考虑是如何将多态的场景更好的结合到技术实现中。举一个不太恰当的例子,开发者是要做千里马,而设计者是要做伯乐。

三、动多态和静多态在设计上的展开

开发者最初接触多态基本都是从动多态开始,即使用虚拟函数来处理父子类的不同的行为。但这种多态的缺点也因此暴露出来,即效率和延期绑定。而在某些情况下,设计者可能既需要多态行为又想避免上述的缺点,或者想在编译期确定一些行为,那么就可以使用静多态来实现。无非是牺牲了一点编译时间增加了一点复杂度而已。特别是本身就大量使用了宏或模板的项目来说,在需要使用静多态时,可能会更有优势。
这再次印证了经常提到的,没有最好的,只有最合适的。一个优秀的设计者,一定是根据项目的实际情况来确定应用哪项技术。而实际情况千差万别,同一个设计者,同一家公司,同一个需求,但不同样的开发团队,可能就有所不同。正如兵法说的“兵无常势,水无常形”。
动多态与静多态不是互斥的,它们是可以综合应用、共同在一个项目中解决问题的。但因为模板编程本身或宏编程本身就具有一定的复杂性和难度,所以很多初学者甚至中级开发人员应用起来都较为吃力,所以设计者一定考虑到这个问题。这也是为什么静多态不如动多态在实际的项目中看到的多的原因。
扬长避短不单纯是指扬某个技术的长和短,还指开发人员开发水平的长和短以及其它类似的长短,这是开发人员与设计人员考虑问题的不同所在。

四、多态体现的设计原则和方法

多态能在面向对象编程中三分天下有其一,是有原因的。它其实可以广泛的实践一些设计原则和方法:
1、开闭原则
对父类封闭,对子类开放。这样就可以更好的解决代码的扩展问题。
2、接口隔离原则
可以使用纯虚类实现接口,来达到更好的灵活性和扩展性。
3、代码重用
这个一看就明白,父类直接可以为子类可用,就看重用的程度有多大罢了。
4、设计模式的应用
在设计模式中,象抽象工厂模式等,都可以广泛的应用到多态的设计。

五、总结

勿在浮砂筑高台。只有掌握技术本身,才能更好的在设计上展开应用。换句话说,一个优秀的设计者本身必须是一个优秀的开发者。这也是前一段时间网上经常说的所谓“PPT架构师”的味道。知其然并知其所以然,顺势而为,才可能有一个优秀的设计出来。

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

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

相关文章

Python数据分析之数据可视化

Python 数据分析重点知识点 本系列不同其他的知识点讲解,力求通过例子让新同学学习用法,帮助老同学快速回忆知识点 可视化系列: Python基础数据分析工具数据处理与分析数据可视化机器学习基础 四、数据可视化 图表类型与选择 根据数据特…

1、操作系统引论

一、操作系统 会使用linux系统 建议大家先学会linux的基础指令,可以看菜鸟教程网站进行学习。 1、各种定义 操作系统定义 管理计算机的 硬件 和软件资源, 能对各类作业进行调度,方便用户使用计算机的程序集合。操作系统运行在内核态&#xf…

HarmonyOS NEXT - 网络请求问题(http)

HTTP(HyperText Transfer Protocal,超文本传输协议)是一种用于传输超媒体文档(如HTML)的应用层协议,它是客户端和服务器之间通信的基础;无论是获取数据、提交表单、上传文件,HTTP都扮…

告别旧版本,功能全面升级!

小伙伴们,今天来给大家唠唠一款超经典的软件——格式工厂!相信很多人都不陌生吧?它可是早期超多人用的视频格式转换工具呢!但随着软件行业的发展,它慢慢被其他工具代替了,像万兴、小丸、AME这些新宠儿一出现…

Obsidian Copilot:打造你的专属 AI 笔记助手

Obsidian Copilot作为一款非常受欢迎的Obsidian插件,不仅极大地提升了用户的笔记管理和信息检索效率,还通过其多样化的AI功能为用户带来了前所未有的便捷体验。本文将详细介绍Obsidian Copilot的核心特点、使用方法及个人体验分享。 核心特点 Obsidian…

VPC4-通达oa-docker逃逸-shiro反序列化-hash传递-CrackMapExec喷射-历史ptt攻击-进程注入

由于本人是菜鸡,不会免杀,所有免杀的部分就直接跳过了 (hhh) 靶场地址: 链接: https://pan.baidu.com/s/1Fh1Zg79n1yjCPe6rrQ2apA 提取码: qiag 第一台ubuntu(docker逃逸,shiro反序列化) fscan扫到一…

C++类与对象——拷贝构造与运算符重载

拷贝构造函数和赋值运算符重载就是C类默认六个函数之二。 拷贝构造函数: 如果⼀个构造函数的第⼀个参数是自身类类型的引用,且任何额外的参数都有默认值,则此构造函数 也叫做拷贝构造函数,也就是说拷贝构造是⼀个特殊的构造函数…

疗养院管理系统设计与实现(代码+数据库+LW)

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装疗养院管理系统软件来发挥其高效地信息处理的作用&#xf…

2024年12月CCF-GESP编程能力等级认证C++编程四级真题解析

四级真题的难度: 一、总体难度评价 CCF-GESP编程能力等级认证C++四级真题的难度通常被认为相对较高。它不仅要求考生具备扎实的C++编程基础,还需要考生掌握一定的算法和数据结构知识,以及良好的问题解决能力。 二、具体难度分析 ‌理论知识考察‌: 单选题和判断题中,会涉…

MySQL开发陷阱与最佳实践:第1章:MySQL开发基础概述-1.1 MySQL简介与应用场景

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 MySQL开发陷阱与最佳实践:第1章:MySQL开发基础概述-1.1 MySQL简介与应用场景1.1.1 MySQL的发展历程与市场地位1.1.2 MySQL的核心特性与技术优势1.1.2…

使用GitHub Actions实现Git推送自动部署到服务器

将网站一键部署到服务器的方案很多,比如纯Shell脚本结合SSH、Jenkins等工具。本文将介绍如何利用GitHub Actions这一免费且轻量的CI/CD工具,实现代码推送后自动部署到云服务器。 之前一直在使用github的工作流,确实是一个比较好用的工具。 我…

PyTorch 系列教程:探索自然语言处理应用

本文旨在介绍如何使用PyTorch进行自然语言处理(NLP)的基础知识,包括必要的库、概念以及实际代码示例。通过阅读本文,您将能够开始您的NLP之旅。 1. 理解PyTorch PyTorch是一个开源的机器学习库,基于Torch库&#xff0…

3.14-1列表

列表 一.列表的介绍和定义 1 .列表 类型: <class list> 2.符号:[] 3.定义列表: 方式1:[] 通过[] 来定义 list[1,2,3,4,6] print(type(list)) #<class list> 方式2: 通过list 转换 str2"12345" print(type(str2)) #<class str> list2lis…

pyroSAR:开源的SAR数据处理与分析工具

今天为大家介绍的软件是pyroSAR&#xff1a;一款开源的SAR数据处理与分析工具。下面&#xff0c;我们将从软件的主要功能、支持的系统、软件官网等方面对其进行简单的介绍。 pyroSAR官网网址为&#xff1a;https://pyrosar.readthedocs.io/en/latest/。 pyroSAR是一个开源Pytho…

Visual Studio里的调试(debugging)功能介绍

参考 1- Introduction to Debugging | Basic Visual Studio Debugging&#xff08;这是一位印度博主视频&#xff0c;我下面做到笔记也主要参考她的视频&#xff0c;但不得不说口音太重了&#xff0c;一股咖喱味&#xff09; 目录 个人对调试浅显的认识和对调试的介绍逐行调…

图论part4|827. 最大人工岛、127. 单词接龙、463. 岛屿的周长

827. 最大人工岛 &#x1f517;&#xff1a;827. 最大人工岛 - 力扣&#xff08;LeetCode&#xff09;827. 最大人工岛 - 给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。返回执行此操作后&#xff0c;grid 中最大的岛屿面积是多少&#xff1f;岛屿 由一…

Java高级-05.反射的作用、应用场景

一.反射的作用 二.案例 Student.class package com.njau.d2_reflect;public class Student {private String name;private int age;private char sex;private double height;private String hobby;public Student(String name, int age, char sex, double height, String …

cherry-studio - 多模型支持的跨平台 AI 桌面助手

GitHub&#xff1a;https://github.com/CherryHQ/cherry-studio 更多AI开源软件&#xff1a;发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI 一款支持多种大语言模型服务的跨平台桌面客户端&#xff0c;兼容 Windows、Linux 和 macOS 系统。它支持主流云端模型&am…

Uniapp 开发 App 端上架用户隐私协议实现指南

文章目录 引言一、为什么需要用户隐私协议&#xff1f;二、Uniapp 中实现用户隐私协议的步骤2.1 编写隐私协议内容2.2 在 Uniapp 中集成隐私协议2.3 DCloud数据采集说明2.4 配置方式3.1 Apple App Store3.2 Google Play Store 四、常见问题与解决方案4.1 隐私协议内容不完整4.2…

LeetCode 环形链表II:为什么双指针第二次会在环的入口相遇?

快慢指针 为什么相遇后让快指针回到起点&#xff0c;再让快指针和慢指针都一步一步地走&#xff0c;它们就会在环的入口相遇&#xff1f; 复杂度 时间复杂度: O(n) 空间复杂度: O(1) public ListNode detectCycle(ListNode head) {ListNode slow head, fast head;ListNode …