面向对象的设计建议

2024-01-11

这是我的代码:

class Soldier {
public:
   Soldier(const string &name, const Gun &gun);
   string getName();
private:
   Gun gun;
   string name;
};

class Gun {
public:
   void fire();
   void load(int bullets);
   int getBullets();
private:
   int bullets;
}

我需要通过 Soldier 对象调用 Gun 的所有成员函数。就像是:

soldier.gun.fire();

or

soldier.getGun().load(15);

那么哪一种设计更好呢?将枪对象隐藏为私有成员并使用 getGun() 函数访问它。或者使其成为公共成员?或者我可以封装所有这些函数,这会使实现变得更加困难:

soldier.loadGun(15); // calls Gun.load()
soldier.fire(); // calls Gun.fire()

那么您认为哪一款最好呢?


我想说选择第二个选择:

soldier.loadGun(15); // calls Gun.load()
soldier.fire(); // calls Gun.fire()

最初需要做更多的工作,但随着系统变得越来越复杂,你可能会发现士兵在开枪之前和之后会想做其他事情(也许检查他们是否有足够的弹药,然后在开枪前尖叫“死吧!!” ,然后嘟囔“那很受伤”,然后检查是否需要重新加载)。它还向士兵类别的用户隐藏了枪支到底如何发射的不必要的细节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面向对象的设计建议 的相关文章

  • CLR 2.0 与 4.0 性能比较?

    如果在 CLR 4 0 下运行 为 CLR 2 0 编译的 NET 程序会运行得更快吗 应用程序配置
  • 使用 lambda 表达式注册类型

    我想知道如何在 UnityContainer 中实现这样的功能 container RegisterType
  • 适合初学者的良好调试器教程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有谁知道一个好的初学者教程 在 C 中使用调试器 我感觉自己好像错过了很多 我知道怎么做 单步执行代码并查看局部变量 虽然这常常给我带来问
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • 当一组凭据下的计划任务启动的进程在另一组凭据下运行另一个程序时,Windows 是否有限制

    所以我有一个简单的例子 其中我有应用程序 A 它对用户 X 本地管理员 有一些硬编码的凭据 然后它使用硬编码的绝对路径启动带有这些凭据的应用程序 B A 和 B 以及 dotnet 控制台应用程序 但是它们不与控制台交互 只是将信息写入文件
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 从客户端访问 DomainService 中的自定义对象

    我正在使用域服务从 Silverlight 客户端的数据库中获取数据 在DomainService1 cs中 我添加了以下内容 EnableClientAccess public class Product public int produ
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回到 C#

    我有一个 c dll 它为我的主 c 应用程序提供一些功能 在这里 我尝试读取一个文件 将其加载到内存 然后返回一些信息 例如加载数据的指针和内存块的计数到 c Dll 成功将文件读取到内存 但在返回主应用程序时 程序由于堆损坏而崩溃 检测
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • 在方法内部执行方法

    我目前正在 FreeCodeCamp 中进行 JavaScript 练习 我的代码应该使用的测试用例之一是函数调用 如下所示 addTogether 2 3 这是我得到的基本功能 function addTogether return 当我
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke

随机推荐

  • 如果已经选择了第一个,则从第二个选择中删除选项

    我正在尝试制作一个体育博彩页面 用户需要选择哪两支球队进行比赛 所以 我有两个selects 我需要删除一个option从第二个select 因为一个团队不能自己比赛 以下是精选内容
  • 函数的返回值存储在哪里

    我读过一些关于堆栈 堆以及它们在程序执行中如何使用的文章 Here http www c sharpcorner com UploadFile rmcochran csharp memory01122006130034PM csharp m
  • 文件权限;我的 www-folder 内容应该归 www-data 所有吗?

    这可能是一个菜鸟问题 但在任何地方都找不到答案 我有一个问题 另一个文件权限问题 https stackoverflow com questions 3483832 another file permissions problem已经帮助我
  • 用 Python 解析化学公式

    我正在尝试解决这个问题 https leetcode com articles number of atoms approach 1 recursion accepted https leetcode com articles number
  • python str.index 时间复杂度

    为了找到字符串中子字符串的位置 需要一个简单的算法O n 2 时间 然而 使用一些有效的算法 例如KMP算法 https en wikipedia org wiki Knuth E2 80 93Morris E2 80 93Pratt al
  • 在Python中组合多个音频文件(带延迟)

    我希望在 Python 中组合一系列不同的音频文件 mp3 要求之一是我需要能够在每个文件的末尾指定延迟 为了说明这一点 例如 文件1 mp3 3秒 延迟 2秒 文件2 mp3 mp3 3秒 延迟 2秒 mp3 4秒 延迟 2秒 file3
  • 窃取焦点,因为 SetForegroundWindow 无法做到这一点

    我知道这听起来很邪恶 但我的意图根本不是这个 用户单击 延迟拍摄 并开始倒计时 在此期间他们会聚焦另一个应用程序 然后倒计时后用户希望我的应用程序重新获得焦点 SetForegroundWindow当它从 PID X 的应用程序运行而 PI
  • 未找到类 ZMQContext

    我在 Ubuntu 14 04 的虚拟机内的 nginx 1 4 6 和 php 5 5 上运行 Web 服务器 并且需要安装 ZeroMQ 扩展 我已按照以下说明进行操作ZMQ http zeromq org area download
  • RIP寄存器不改变

    为什么当我继续使用c和内联汇编打印堆栈和指令指针寄存器时它们不会改变 因为逻辑上其他程序同时运行 所以它们应该在打印时不断改变 操作系统和 CPU 一起工作 为进程 同时运行 提供 CPU 切片 实际上 他们通过分配时间片来虚拟化 CPU
  • 如何在多行中编写 f 字符串而不引入意外的空格? [复制]

    这个问题在这里已经有答案了 考虑以下代码片段 name1 Nadya name2 Jim def print string string f name1 n name2 print string print string 产生 Nadya
  • Monodevelop - 仅使用 sudo 运行

    我已经在我的 Debian amd64 jessie 构建上安装了 Mono 和 Monodevelop 并且我只能使用提升的权限运行 monodevelop 从 UI startesque 菜单启动 monodevelop 似乎什么也没发
  • 带有位置参数的 Git 别名

    基本上我正在尝试别名 git files 9fa3 执行命令 git diff name status 9fa3 9fa3 但 git 似乎没有将位置参数传递给别名命令 我努力了 alias files git diff name stat
  • 为什么 Apache 没有在 XAMPP 上启动 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 直到昨天 我的本地主机一切都很好 但从昨天开始 本地主机无法打开 它说 无法连接 我尝试了很多次来启动Apache on XAMPP 但它说消息忙 我
  • .NET .config 文件中 ConnectionString 元素的用途

    在中存储和读取应用程序的连接字符串有什么区别
  • 转移 PyPI 包的所有权

    As per PEP 541 https www python org dev peps pep 0541 现在可以认领废弃的 PyPI 项目 有人这样做过吗 联系谁 我尝试过dist utils 邮件列表 https mail pytho
  • Get-EventLog - 某些事件日志源缺少有效消息

    我正在使用 get eventlog 提取和过滤系统事件日志数据 我发现 get event log 无法正确返回与某些条目关联的消息 这些条目通常显示在事件日志查看器中 例如 get eventlog logname system sou
  • Python 模拟多个具有不同结果的调用

    我希望能够对特定属性函数进行多次调用 为每次连续调用返回不同的结果 在下面的示例中 我希望增量在第一次调用时返回 5 然后在第二次调用时返回 10 Ex import mock class A def init self self size
  • OpenCV 和 VS2010:致命错误 LNK1104:致命错误 LNK1104:无法打开文件“tbb_debug.lib”

    我尝试按照本指南使用 Visual Studio C 2010 安装 OpenCV 使用 Windows 7 64 位 在 Visual C 2010 Express 中安装 OpenCV 2 4 3 https stackoverflow
  • Django 独立脚本

    我正在尝试从另一个 python 脚本访问我的 Django v1 10 应用程序数据库 但遇到了一些问题 这是我的文件和文件夹结构 store store init py settings py urls py wsgi py store
  • 面向对象的设计建议

    这是我的代码 class Soldier public Soldier const string name const Gun gun string getName private Gun gun string name class Gun