编程之道:【面向对象编程的实际应用】封装、继承和多态的魔法

编程是一门艺术,而面向对象编程(Object-Oriented Programming,简称OOP)则是这门艺术的重要画笔。在OOP中,封装、继承和多态是三个核心概念,它们的实际应用能够为代码注入魔法,使之更加灵活、可维护和可扩展。在本文中,我们将探讨这些概念的实际应用,以及它们如何改变我们的编程方式。

封装:隐藏细节,暴露接口

封装是OOP中的第一个魔法,它的核心思想是将数据和行为封装在一个对象内部,然后通过公共接口与外界交互。这种方式可以隐藏对象的内部细节,仅向外部提供有限的访问权限,提高了代码的安全性和可维护性。

实际应用示例:

考虑一个银行账户的类:

class BankAccount {constructor(accountNumber, balance) {this.accountNumber = accountNumber;this.balance = balance;}deposit(amount) {if (amount > 0) {this.balance += amount;}}withdraw(amount) {if (amount > 0 && amount <= this.balance) {this.balance -= amount;}}getBalance() {return this.balance;}
}

在这个示例中,我们封装了账户的细节,只暴露了必要的接口,如存款、取款和查询余额,从而确保账户的安全性和一致性。

继承:构建新的魔法,扩展已有的力量

继承是OOP中的第二个魔法,它允许一个类(子类)继承另一个类(父类)的属性和方法。这意味着你可以构建新的类,扩展已有的类的功能,同时保留已有类的特性。

实际应用示例:

考虑一个动物类的层次结构:

class Animal {constructor(name) {this.name = name;}speak() {// 默认的通用动物发声方法}
}class Dog extends Animal {speak() {return `${this.name} says Woof!`;}
}class Cat extends Animal {speak() {return `${this.name} says Meow!`;}
}

在这个示例中,我们有一个通用的Animal类,然后派生了DogCat子类。这允许我们使用通用的Animal方法,同时为不同的动物类型定义特定的行为。

多态:灵活应对不同情境

多态是OOP中的第三个魔法,它允许不同的对象对相同的方法做出不同的响应。这增加了代码的灵活性和可扩展性,使得我们可以在不修改现有代码的情况下添加新的功能。

实际应用示例:

考虑一个图形类的多态应用:

class Shape {area() {// 默认的通用图形面积计算方法}
}class Circle extends Shape {constructor(radius) {super();this.radius = radius;}area() {return Math.PI * this.radius * this.radius;}
}class Rectangle extends Shape {constructor(length, width) {super();this.length = length;this.width = width;}area() {return this.length * this.width;}
}

在这个示例中,不同的形状(圆和矩形)都有一个area方法,但它们的实现方式不同。通过多态,我们可以以相同的方式计算不同形状的面积。

封装、继承和多态是面向对象编程中的三个核心概念,它们赋予了代码更强大的魔法。通过封装,我们可以隐藏细节,暴露接口;通过继承,我们可以构建新的魔法,扩展已有的力量;通过多态,我们可以灵活应对不同情境。这些概念的实际应用使我们能够编写更加模块化、可维护和可扩展的代码,将编程提升到一门真正的艺术。希望这篇文章让你更深入地理解了这些魔法,鼓励你在日常编程中运用它们创造出更多的魔法。

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

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

相关文章

周鸿祎为360智脑招贤纳士;LLM时代的选择指南;Kaggle大语言模型实战;一文带你逛遍LLM全世界 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 思否「齐聚码力」黑客马拉松&#xff0c;用技术代码让生活变得更美好 主页&#xff1a;https://pages.segmentfault.com/google-hacka…

Flutter(十)网络请求和文件

目录 文件操作网络请求1.Dio库2.websocket3.JSON转Dart Model 文件操作 APP目录 Android 和 iOS 的应用存储目录不同&#xff0c;PathProvider (opens new window)插件提供了一种平台透明的方式来访问设备文件系统上的常用位置。该类当前支持访问两个文件系统位置&#xff1a;…

使用vars函数捕获对象属性值

使用vars函数捕获对象属性值 作用 返回一个对象的属性 → \rightarrow →值字典 class Animal:def __init__(self) -> None:self.kind "animal"...class Person(Animal):def __init__(self, name: str, id: str, age: int) -> None:super().__init__()self…

2023Java ——八股文(面试题冲击小测 15w)

这里写目录标题 Java基础篇语法篇JDK、JRE和JVM的关系栈和堆分别存的什么数据异步和同步线程和进程区别java的数据类型有哪些equals和HashCode重写的问题?深拷贝和浅拷贝的区别和equals的区别常见的运行时异常有哪些&#xff1f; 集合集合的形式List和Set的区别ArrayList和Lin…

kubesphere中部署grafana实现dashboard以PDF方式导出

1&#xff0c;部署grafana-image-renderer 2&#xff0c;部署grafana GF_RENDERING_SERVER_URL http://ip:30323/render #grafana-image-renderer地址 GF_RENDERING_CALLBACK_URL http://ip:32403/ #grafana地址 GF_LOG_FILTERS rend…

【ag-grid-vue】列定义(Updating Column Definitions)

列定义一节解释了如何配置列。可以在初始设置列之后更改列的配置。本节介绍如何更新列定义。 添加和删除列 可以通过更新提供给网格的列定义列表来添加和删除列。当设置新列时&#xff0c;网格将与当前列进行比较&#xff0c;并计算出哪些列是旧的(要删除)、哪些列是新的(创建…

BookStack开源免费知识库docker-compose部署

BookStack&#xff08;书栈&#xff09;是一个功能强大且易于使用的开源知识管理平台&#xff0c;适用于个人、团队或企业的文档协作和知识共享。 一、BookStack特点 简单易用&#xff1a;BookStack提供了一个直观的用户界面&#xff0c;使用户能够轻松创建、编辑和组织文档多…

Kali Linux进行移动应用安全测试

使用Kali Linux进行移动应用安全测试是一项关键任务&#xff0c;可以帮助识别和修复移动应用中的安全漏洞。以下是一个基本的步骤指南&#xff0c;展示如何在Kali Linux中进行移动应用安全测试。 步骤&#xff1a; 准备环境&#xff1a; 确保 已经安装了Kali Linux&#xff0c…

Python爬虫追踪新闻事件发展进程及舆论反映

大家好&#xff01;在当今信息爆炸的时代&#xff0c;了解新闻事件的发展进程和舆论反映对于我们保持对时事的敏感度和了解社会动态至关重要。在本文中&#xff0c;我将与你分享使用Python爬虫追踪新闻事件发展进程和舆论反映的方法&#xff0c;帮助你获取及时、全面的新闻信息…

java 基础知识 循环的几个题目

1、输出1~100的累加和 结果显示在屏幕&#xff0c;显示在文件res1.txt中 2、输出1-~100的偶数和 结果显示在屏幕&#xff0c;显示在文件res2.txt中 3、输出所有水仙花数&#xff1a; 100~999的数中出现个位数的立方十位数的立方百位数的立方这个数本身 4、输出由9行9列星号组成…

redis windows 版本安装

1. 下载windows安装包并解压 如果是Linux版本可以直接到官网下载&#xff0c;自3.x起官网和微软网站就没有redis安装包更新了&#xff0c;好在github有开发者在编译发布更新&#xff08;目前最新有5.0.9版本可下&#xff09;&#xff0c;地址&#xff1a;redis windows 5版本下…

【java安全】JNDI注入概述

文章目录 【java安全】JNDI注入概述什么是JNDI&#xff1f;JDNI的结构InitialContext - 上下文Reference - 引用 JNDI注入JNDI & RMI利用版本&#xff1a;JNDI注入使用Reference 【java安全】JNDI注入概述 什么是JNDI&#xff1f; JNDI(Java Naming and Directory Interf…

Matlab(结构化程式和自定义函数)

目录 1.脚本编辑器 2.脚本流 2.1 控制流 2.2 关系&#xff08;逻辑&#xff09;操作符 3.脚本与函数 1.脚本编辑器 Matlab的命名规则&#xff1a; 常用功能&#xff1a; 智能缩进&#xff1a; 在写代码的时候&#xff0c;有的时候代码看起来并不是那么美观&#xff08;可读性…

基于 CentOS 7 构建 LVS-DR 群集,配置nginx负载均衡。

基于 CentOS 7 构建 LVS-DR 群集。 关闭防火墙 [rootlocalhost ~]# systemctl stop firewalld 安装ifconfig yum install net-tools.x86_64 -y 准备四台虚拟机 IP 用途 19.168.244.144 客户端 192.168.244.145 lvs 192.168.244.148 RS 192.168.244.149 RS 在DS上 …

react ts

一、项目搭建 1、创建项目 使用vite生成项目 npx create-react-app react-ts-project --template typescript 启动项目 yarn start 删除无用组件 2、设计目录结构 资源说明http网络请求assets公共资源components组件router路由配置utils工具模块store状态机App.tsx应用…

详解过滤器Filter和拦截器Interceptor的区别和联系

目录 前言 区别 联系 前言 过滤器(Filter)和拦截器(Interceptor)都是用于在Web应用程序中处理请求和响应的组件&#xff0c;但它们在实现方式和功能上有一些区别。 区别 1. 实现方式&#xff1a; - 过滤器是基于Servlet规范的组件&#xff0c;通过实现javax.servlet.Filt…

SpringBoot初级开发--加入Log4j进行日志管理打印(6)

日志记录在整个java工程开发中占着很重要的比重&#xff0c;因为很多问题的排查需要通过日志分析才能确认。在SpringBoot中我用得最多的就是log4j这个日志框架。接下来我们具体配置log4j. log4j定义了8个级别的log&#xff08;除去OFF和ALL&#xff0c;可以说分为6个级别&#…

在云原生时代,构建高效的大数据存储与分析平台

文章目录 1. **选择适当的数据存储技术&#xff1a;**2. **采用分布式架构&#xff1a;**3. **数据分区和索引&#xff1a;**4. **采用列式存储&#xff1a;**5. **数据压缩和编码&#xff1a;**6. **使用缓存技术&#xff1a;**7. **数据分片和复制&#xff1a;**8. **自动化运…

webpack5(一)

什么是webpack webpack是一个静态资源打包工具&#xff0c;它会以一个或者多个文件作为打包的入口&#xff0c;将整个项目的所有文件编译组合成一个或多个文件输出出去。输出的文件就是编译好的文件&#xff0c;可以在浏览器端运行。一般将 webpack 输出的文件称为 bandle 。 …

做平面设计一般电脑可以吗 优漫动游

平面设计常用的软件如下&#xff1a;Photoshop、AutoCAD、AI等。其中对电脑配置要求高的是AutoCAD&#xff0c;可运行AutoCAD的软件均可运行如上软件。 做平面设计一般电脑可以吗 AutoCAD64位版配置要求&#xff1a;AMDAthlon64位处理器、支持SSE2技术的AMDOpteron处理器、…