我应该实例化集合还是从集合继承?

2024-02-29

在创建类时,特别是那些涉及集合的类时,我多次问自己这个问题,但我从未给出令人满意的答案。这是一个OOP设计问题。

例如,在支票簿注册程序中,假设我有一类BankAccount。 BankAccounts 包含涉及帐户名称、帐户类型(支票、储蓄等枚举)和其他数据的数据,但最重要的是以下数据的集合:Adjustment账户中的s(存款或取款)。

在这里,我有两个选项来保存调整集合:

  1. 实例化一个集合并将其保留为 BankAccount 类中的成员。这就像说“银行账户has调整的集合。”
  2. 从集合继承。这就像说“银行账户is调整的集合。”

我认为这两种解决方案都很直观,当然,两者都有一些优点和缺点。例如,实例化允许类(在只允许单个基类的语言中)从另一个类继承,而从集合继承则可以轻松控制 Add、Remove 和其他方法,而无需编写代理方法来“包装” ' 那些。

那么,在这种情况下,哪种方法更好呢?


对我来说,一个银行账户has调整的集合。一个银行账户is not调整的集合,因为它“是”远不止于此:它也是“是”名称和类型等。

因此,对于您的情况(以及类似的情况),我建议您在班级内聚合一个集合。

如有疑问,请避免继承。 :-)

我可以进一步论证这一点。为了正确使用继承,子类必须满足里氏替换原则 http://en.wikipedia.org/wiki/Liskov_substitution_principle;这意味着,就你而言,BankAccount应该是任何地方的有效类型Collection是期待。我不认为是这样,因为Collection可能公开诸如Add() and Remove(),而您将希望对在银行帐户中添加和删除调整进行一些控制,而不是让人们自由地添加和删除它们。

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

我应该实例化集合还是从集合继承? 的相关文章

  • Delphi:写入后代类中私有祖先的字段

    我需要修复第三方组件 该组件的类具有私有变量 该变量由其后代主动使用 TThirdPartyComponentBase class private FSomeVar Integer public end TThirdPartyCompone
  • 一个类应该验证自身还是创建另一个类来验证它?

    假设我有一堂课 class NavigationData float roll float pitch double latitude double longitude 如果我想创建一个方法 const bool validate cons
  • R 中使用 `UseMethod()` 与 `inherits()` 来确定对象的类

    如果我需要根据 R 对象的类以不同的方式处理它们 我可以使用if and else在单个函数内 foo lt function x if inherits x list Foo the list else if inherits x num
  • 在javascript中访问函数内的实例变量?

    如何以最简单的方式访问函数内的实例变量 function MyObject Instance variables this handler Methods this enableHandler function var button doc
  • 什么是对象序列化和反序列化?

    什么是对象序列化 and 反序列化 序列化与读取对象的属性 然后用它们填充 DataRow 的列 最后将 DataRow 保存在数据库中等普通技术有什么区别 序列化通常是指创建可用于存储 可能在文件中 通过网络传输或仅用于进程之间传输的数据
  • 什么是拉姆达?

    有人可以很好地描述什么是 Lambda 吗 我们为它们设置了一个标签 它们涉及 C 问题的秘密 但我还没有找到一个很好的定义和解释来解释它们是什么 闭包 lambda 和匿名函数不一定是同一件事 匿名函数是任何没有 或者至少不需要 自己名称
  • 为什么需要在 Python 方法中显式使用“self”参数? [复制]

    这个问题在这里已经有答案了 当在 Python 中的类上定义方法时 它看起来像这样 class MyClass object def init self x y self x x self y y 但在其他一些语言中 例如 C 您可以使用
  • Java中接口作为方法参数

    前几天去面试 被问到了这样的问题 问 反转链表 给出以下代码 public class ReverseList interface NodeList int getItem NodeList nextNode void reverse No
  • 从同一个类中的另一个构造函数调用构造函数

    我有一个带有两个构造函数的类 C 这是代码片段 public class FooBar public FooBar string s constructor 1 some functionality public FooBar int i
  • 在方法内部执行方法

    我目前正在 FreeCodeCamp 中进行 JavaScript 练习 我的代码应该使用的测试用例之一是函数调用 如下所示 addTogether 2 3 这是我得到的基本功能 function addTogether return 当我
  • 苹果、橙子和指向最派生的 C++ 类的指针

    假设我有一堆水果 class Fruit class Apple public Fruit class Orange public Fruit 以及一些作用于所述水果的多态函数 void Eat Fruit f Pesticide p vo
  • 面向对象编程语言中的引用默认情况下是否应该不可为空? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 优雅降级 - 何时考虑

    在为使用 AJAX 的应用程序设计和构建 UI 时 您何时考虑优雅降级 对于禁用 JavaScript 或正在使用屏幕阅读器的用户 最后 网站的 AJAX 版本完全完成后 在每个发展阶段 I don t 还有别的事 这些日子 渐进增强 ht
  • 克隆和引用传递问题

    所以在过去的几天里 我一直在绞尽脑汁地试图让一个类能够正确克隆 问题是克隆不会删除 重做任何引用传递 结果是 主数据对象仍然作为引用传递 从而完全抵消了克隆的效果 这是问题的简化版本 class my class private data
  • 如何使用“instanceof”实现泛型的“equals”方法?

    我有一堂课接受泛型 我想覆盖equals以一种不尴尬的方式 即看起来干净并且代码量最少的东西 但对于非常一般的用例 现在我有这样的事情 public class SingularNode
  • 转换为父类型——Java

    这实际上是一种验证 有没有any将子对象转换为父类型有好处吗 假设我有两个课程Parent and Child Child正在延伸Parent 有什么区别吗 代码 Parent p new Child and Parent p Parent
  • Swift 语言中的抽象函数

    我想用 swift 语言创建一个抽象函数 是否可以 class BaseClass func abstractFunction How do I force this function to be overridden class SubC
  • 如何从另一个UserControl继承一个UserControl?

    是否可以从另一个用户控件继承用户控件 我想要实现的是从另一个用户控件继承的用户控件 所以我有baseusercontrol ascx 它只有文本 Stuff 然后我有另一个用户控件 childusercontrol ascx 继承了base
  • 这应该被称为对象切片的某种特殊情况吗?

    假设我有课Derived派生自类Base然而sizeof Derived gt sizeof Base 现在 如果分配一个数组Derived像这样 Base myArray new Derived 42 然后尝试访问n第一个对象使用 doS
  • 避免 Java 中的重复导入:继承导入?

    有没有办法 继承 导入 Example 常见枚举 public enum Constant ONE TWO THREE 使用此枚举的基类 public class Base protected void register Constant

随机推荐

  • Kendo UI 网格在调用读取后未填充

    好吧 我还有另一个 我确信我又错过了一些简单的东西 使用 json 结果集填充 Kendo 网格 加载是通过从剑道下拉列表控件中进行选择来触发的 我可以看到数据从我的 webapi 返回并转换为 json 结果 但数据未显示在网格中 我错过
  • 避免以编程方式启动使用创建的上下文的 HiveThriftServer2

    在 Spark 2 0 0 中 我们尝试使用 ThriftServer 从 Spark 临时表中查询数据 首先 我们创建了启用了 Hive 支持的 SparkSession 目前 我们使用 sqlContext 启动 ThriftServe
  • 轨道模型和独特的组合

    我有一个 Rails 应用程序 其中有一个名为friendrequests 它看起来像这样 user1 id integer user2 id integer hasaccepted boolean 我正在创建一个添加好友的选项 但好友请求
  • C++派生类型的自动工厂注册

    像我之前的许多人一样 我正在尝试让我的派生类型自动向我的工厂注册 我通读了很多问题 并试图专注于我在那里没有找到的问题 除了自动注册之外 一切都运行良好 我的目标 automatically register any derived cla
  • PHP语言规范中“[”怎么会是运算符呢?

    On the http php net manual en language operators precedence php http php net manual en language operators precedence php
  • 不带 @XMLRootElement 的 JAXB 部分解组元素

    我正在使用部分解组的例子JAXB 但我无法解组不在根级别的 XML 元素 因为它们没有 XmlRootElement 标记 在我的示例中 我尝试读取shipTo Element而不是purchaseOrder Element 通常我会使用
  • 将日期附加到使用 Sweave 生成​​的 PDF

    我通过 Sweave 生成 每日报告 我想在 PDF 名称中附加当前日期 格式为 YYYYMMDD 我使用以下代码来生成文件 rnwfile lt system file Sweave Margin Rnw package utils Sw
  • 如何在 Django 中记录成功和失败的登录和注销尝试?

    我想在 Django 中记录所有用户登录和注销尝试 该记录应显示所有登录 注销用户的历史记录 IP 地址和登录 注销时间 The django admin log表似乎只记录其他模型的ADD DELETE CHANGE活动 而不是用户访问的
  • 简单来说,什么是工厂?

    什么是工厂 我为什么要使用工厂 你熟悉吗JDBC https docs oracle com javase tutorial jdbc basics index html 这是一个完整的 抽象 工厂 这是一个很好的现实世界例子 Factor
  • 更改数据库模式和单元测试

    在我们开始之前 我知道有相当多的人认为访问数据库的测试不是 单元测试 也许 集成测试 是一个更好的名字 无论哪种方式 开发人员都会测试数据库 为了启用单元测试 我有一个开发人员本地数据库 我会在每次测试开始时清除该数据库并填充一组已知的数据
  • 在 Plotly 中用新数据更新图形的高性能方法?

    我想使用每个条形值的滑块来更新条形图 但是 我希望条形动态变化as滑块发生变化 我已经实现了这个使用oninput 目前 我有以下内容 这是相当滞后的 HTML h1 Plotly Test h1 div style width 480px
  • 检索 tableview Swift 领域的 List 属性计数

    我正在使用 Realm 3 和 Swift 4 但对 Realm 和 Swift 还很陌生 这里需要指导 给定这个领域模型 class Person Object Mappable let dog List
  • pip install 错误:安装脚本指定了绝对路径

    我遇到了 pip 的奇怪行为 呼唤 pip install git https github com username repo 通常可以工作 但在某些包上它会以异常方式失败 Downloading unpacking git git gi
  • 为 python3 安装 OpenCV

    我遵循了许多手册 教程如何安装OpenCV http docs opencv org 2 4 doc tutorials introduction linux install linux install html highlight ins
  • Postgresql gem install pg 0.18.4 通过,捆绑安装失败

    Mac 操作系统 El Capitan 捆绑包安装失败并显示 compiling pg connection c pg connection c 2394 3 warning implicit declaration of function
  • 使用多部分列标识符

    我确信这必须在某个地方记录下来 但在我的一生中 我似乎找不到任何解释该行为的实际文档 采用 4 种方法来引用表格 我不相信还有更多 但请随时纠正我 当前数据库 远程数据库 链接服务器 Synonym 他们在使用多部分列标识符时的行为似乎有所
  • 根据内容过滤 OpenFileDialog 中显示的文件?

    有没有办法修改 OpenFileDialog 的行为 以便它查看它打开的文件夹中的文件 然后根据其内容忽略某些文件 一个示例是打开一个充满 Zip 文件的文件夹 但仅显示包含特定文件的文件夹 从文档中 有 HookProc 但我不太确定如何
  • 以编程方式更改 UITextField 键盘类型

    是否可以以编程方式更改 uitextfield 的键盘类型 以便可以实现类似的操作 if user is prompted for numeric input only textField setKeyboardType Number Pa
  • 正则表达式匹配除两个单词之外的任何内容

    我正在尝试编写一个正则表达式来匹配 foo 和 bar 以外的任何内容 我找到了如何匹配除一个单词之外的任何内容正则表达式匹配不包含单词的行 https stackoverflow com questions 406230 regular
  • 我应该实例化集合还是从集合继承?

    在创建类时 特别是那些涉及集合的类时 我多次问自己这个问题 但我从未给出令人满意的答案 这是一个OOP设计问题 例如 在支票簿注册程序中 假设我有一类BankAccount BankAccounts 包含涉及帐户名称 帐户类型 支票 储蓄等