实现Vehicle类的不同版本理解封装

news/2025/3/18 16:29:47/文章来源:https://www.cnblogs.com/hmi1234/p/18779194

实现Vehicle类的不同版本理解封装

版本一

没有数据隐藏的类

创建一个Vehicle 类实现上面的 UML 类图。

  • 含有两个 public 属性:
属性 解释
load 车辆当前载货量
maxLoad 车辆最大载货量
  • 含有一个公有的构造函数用于初始化最大载货量属性 maxLoamaxLoad

  • 含有两个公有的函数:

权限 数据类型 方法名 备注
public double getLoad() 用于得到当前的载货量
public double getMaxLoad() 用于取得最大载货量

(注意:所有的数据都是假定以千克(kilograms)作为单位的。

在这个版本的Vehicle类中,你将把所有成员的属性设置为 public,这样在下面测试程序 TestVehicle1 中可以直接访问这些成员。

Vehicle实现类:

#include <iostream>
#include <iomanip>
using namespace std;class Vehicle {
public:double load;double maxLoad;Vehicle(double max_load) : maxLoad(max_load), load(0.0) {}double getLoad() const { return load; }double getMaxLoad() const { return maxLoad; }
};int main() {Vehicle vehicle(10000.0);cout << "Add box #1 (500kg)" << endl;vehicle.load += 500.0;cout << "Add box #2 (250)" << endl;vehicle.load += 250.0;cout << "Add box #3 (5000)" << endl;vehicle.load += 5000.0;cout << "Add box #4 (4000)" << endl;vehicle.load += 4000.0;cout << "Add box #5 (300)" << endl;vehicle.load += 300.0;cout << "Vehicle load is " << fixed << setprecision(1) << vehicle.getLoad() << " kg" << endl;return 0;
}

总结与反思

从程序的运行结果来看,你发现了什么问题?思考如何才能避免?

一遍过的 暂时没有需要注意的. 结果输出需要使用浮点格式 fixed << setprecision(1)

版本二:

基本数据隐藏

为了解决第一个版本中的问题,你应该隐藏类中的数据成员(load maxLoad) 并且提供一个方法addBox, 来检查车辆是否会发生超载。

创建一个 Vehicle 类实现上面的UML类图。

  1. loadmaxLoad 属性修改为 private(私有的)。

  2. 添加 addBox 方法。

    public boolean addBox(double weight); //参数为所加箱子重量

    这个方法必须检查加上一个箱子后是否会超过车辆的最大载货量。如果超过了, 应该拒绝装载这个箱子并返回 false;否则把箱子加到车上并返回 true。 注意:所有的数据都是假定以千克(kilograms)作为单位的。

Vehicle实现类:

#include <iostream>
#include <iomanip>
using namespace std;class Vehicle {
private:double load; double maxLoad;  public:Vehicle(double max_load) : maxLoad(max_load), load(0.0) {}double getLoad() const {return load;}double getMaxLoad() const {return maxLoad;}bool addBox(double weight) {if (load + weight > maxLoad) {return false; } else {load += weight;  return true;}}
};int main() {Vehicle vehicle(10000.0);cout << "Add box #1 (500kg)" << vehicle.addBox(500.0) << endl;cout << "Add box #1 (250kg)" << vehicle.addBox(250.0) << endl;cout << "Add box #1 (5000kg)" << vehicle.addBox(5000.0) << endl;cout << "Add box #1 (4000kg)" << vehicle.addBox(4000.0) << endl;cout << "Add box #1 (300kg)" << vehicle.addBox(300.0) << endl;cout << "Vehicle load is " << fixed << setprecision(1) << vehicle.getLoad() << " kg" << endl;return 0;
}

版本三

现在假设你将要作一些关于车辆发动机和轮胎等磨损的计算,这些计算使 用牛顿表示的重量。

创建一个Vehicle 类实现上面的 UML 类图。

修改构造方法,getLoad(), getMaxLoad(), 和 addBox() 方法,使它们使用一个从千克
到牛顿的相互转换。你可以定义下面的私有方法:

private double kiloToNewts(double weight) { ...... };
private double newtsToKilo(double weight) { ...... };

注意 vehicle 对象的内部数据是以牛顿为单位的,而外部数据(在方法中传递的参数)还是以千克为单位 。

Vehicle 类的实现代码


#include <bits/stdc++.h>
using namespace std;class Vehicle {private:double load;double maxLoad;double kiloToNewts(double weight) const {return weight * 9.81;}double newtsToKilo(double weight) const {return weight / 9.81;}public:Vehicle(double max_load) : maxLoad(max_load), load(0.0) {}double getLoad() const {return load;}double getMaxLoad() const {return maxLoad;}bool addBox(double weight) {double weightInNewts = kiloToNewts(weight);if (load + weightInNewts > maxLoad) {return false;} else {load += weightInNewts;return true;}}double newtsToKilo(double weight)  {return weight / 9.81;}double kiloToNewts(double weight)  {return weight * 9.81;}
};int main() {Vehicle vehicle(10000.0);cout << "Add box #1 (500kg)" << vehicle.addBox(500.0) << endl;cout << "Add box #1 (250kg)" << vehicle.addBox(250.0) << endl;cout << "Add box #1 (5000kg)" << vehicle.addBox(5000.0) << endl;cout << "Add box #1 (4000kg)" << vehicle.addBox(4000.0) << endl;cout << "Add box #1 (300kg)" << vehicle.addBox(300.0) << endl;cout << "Vehicle load is " << fixed << setprecision(1) << vehicle.getLoad() << " kg" << endl;return 0;
}

程序运行结果:

Add box #1 (500kg)1
Add box #1 (250kg)1
Add box #1 (5000kg)0
Add box #1 (4000kg)0
Add box #1 (300kg)0
Vehicle load is 7357.5 kg

Vehicle 类的第二个和第三个版本采用相同的测试代码,输出的结果有没有发生变化?从代码可维护性的角度谈谈封装的好处。

浅谈封装的好处:

  • 信息隐藏

    封装可以隐藏内部的具体细节, 消费者只需要调用生产者内部接口,消费者不参与服务内部的实现过程。

  • 简化接口

    封装后可以简化接口类的设计。即使的方法实现多么复杂,外部的接口依旧可以保持简单的接口调用。

  • 易拓展性

    通过对接口的的抽象定义,可以实现对后期服务的拓展和维护。抽丝剥茧将程序的结构高度保持高内聚、低耦合的特性,方便协同开发。

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

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

相关文章

KUKA库卡KR210机械手控制柜维修全攻略

在现代工业生产中,库卡机器人因其出色的性能和稳定性,已成为许多企业的首选。然而,即使是精密的设备,也难免会遇到KUKA机械手KR210故障。控制柜是机器人的“大脑”,负责接收和执行各种指令,控制机器人的运动、姿态和操作。 KUKA机械臂KR210控制器故障诊断 1. 电源故障:检…

ciscn暨长城杯 广东赛区 ISW阶段应急响应

ciscn暨长城杯 广东赛区 ISW阶段应急响应 题目介绍 小路是一名网络安全网管,据反映发现公司主机上有异常外联信息,据回忆前段时间执行过某些更新脚本(已删除),现在需要协助小路同学进行网络安全应急响应分析,查找木马,进一步分析,寻找攻击源头,获取攻击者主机权限获取…

初识Open3D

Step01初识Open3d 程序代码: import open3d as o3d #导入Open3d库 def main():#定义主函数box = o3d.geometry.TriangleMesh.create_box(width=3.0, height=2.0, depth=1.0)#创建一个长方体对象box.compute_vertex_normals() #计算法向量vis = o3d.visualization.Visualizer(…

20222223 实验一《Python程序设计》实验报告

20222223 2024-2025-2 《Python程序设计》实验一报告课程:《Python程序设计》 班级: 2222 姓名: 李東霖 学号: 20222223 实验教师:王志强 实验日期:2025年3月12日 必修/选修: 公选课一、实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能;(编写书中的程序…

交换节点 - 环

树上交换节点给定一棵树,每个节点有一个权值。现在每次可以交换任意两个节点的权值,请问最少多少次交换可以使得每个节点的权值等于它的编号? 保证给出的权值是一个排列,也就是说保证一定有解。时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M输入描…

Arduino雷达使用Android移动应用程序

该系统可以检测障碍物并收集距离和角度信息,并且可以通过移动应用程序通过蓝牙进行控制。 Arduino雷达使用Android移动应用程序本项目是一个由超声波传感器和伺服电机驱动的雷达系统。该系统可以检测障碍物并收集距离和角度信息,并且可以通过移动应用程序通过蓝牙进行控制。该…

使用cursor打造智能客服demo

cursor AI它真的是非常强大。 今天讲下如何使用它,搭配deepseek api接口,来生成一个智能客服系统。这是最终的效果。首先cursor需要登录后才能使用。登录之后有两周的免费试用期。我们在窗口的右侧填写智能客服的需求。帮我实现一个网页智能客服。详细要求如下: 1.生成一个h…

【蓝牙小程序】小程序使用echart图表报错:setOption of undefined

转载自:https://developers.weixin.qq.com/community/develop/doc/0004ac054ccec0f26df7baa8756800问题:小程序使用echart图表报错 Cannot read property setOption of undefined;at api request success callback function TypeError: Cannot read property setOption of un…

前端中的Javascript

前端中的Javascript javascript定义方式内联JavaScript直接在HTML元素的事件属性中编写JavaScript代码<body><h1>Hello, World!</h1><button onclick="alert(Button clicked!)">Click Me</button> </body>内部JavaScript可以直接…

NVM:安装配置使用

一、简介 在实际的开发和学习中可能会遇到不同项目的 node 版本不同,而出现的兼容性问题。 而 nvm 就可以很好的解决这个问题,它可以在同一台机器上下管理多个 node 版本,使得程序员可以轻松地安装、卸载和切换不同的 node 版本。 在下载和配置 nvm 前,需要在控制面板中先删…

硬盘科普,M.2,PCI-E,NVMe 傻傻分不清

首先从三个层面去理解这个问题:物理接口,通道,协议 1:物理接口(相当于通讯中的电,光口) 大白话- 物理规格,像是 公路,铁路 专门跑PCI-E通道的那个物理接口:扩展性极强,可以插显卡的PCI-E X16的那个物理接口,或者插网卡,声卡的那个PCI-E X1那个物理接口,都是属于一类…