防止/限制方法继承

2024-02-07

我有一个应用程序,其中许多对象都扩展一个抽象类,该类定义了类似的方法create() edit() retrieve() and delete()。由于每个子类对这些函数都使用相同的逻辑,因此抽象类定义了默认行为,并且在需要增强的少数情况下,子类可以覆盖或使用我内置的钩子。

现在我遇到的情况是一些子类需要变得不可变,这意味着它们不应该edit() or delete()方法。在我看来,这种需求听起来像是一个名为类似的界面的工作immutable不可变类可以实现它。问题是接口不会阻止方法被调用,它们只是强制方法的存在。所以这显然是行不通的。

制作两个父类,一个用于可变对象,一个用于不可变对象是丑陋的,并且可能会在维护过程中出现问题。我可以让不可变对象用一个什么都不做的空方法覆盖有问题的方法,但这看起来也很混乱,而且好像我当时没有做正确的 OOP。

那么,您建议允许大量类全部继承一组方法,但其中一些类不继承所有方法的最佳方法是什么? (所讨论的应用程序是用 php 编写的,但任何语言的通用 OOP 技术仍然会有所帮助)。


创建一个不可变基类作为基类的子类。 不可变基应该实现final http://php.net/manual/en/language.oop5.final.php重写 edit() 和 delete() ,它们不执行任何操作或引发错误。

Final,保证所有不可变子项都无法编辑或删除

该策略的好处

  • 通过测试 instanceof immutable-base 轻松检查对象是否不可变

  • 通过修改对象的扩展内容,可以轻松地将对象从不可变对象更改为不可变对象,然后再返回到不可变对象

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

防止/限制方法继承 的相关文章

随机推荐

  • 尝试在 Rails 中调用我的服务时出现“未初始化常量”

    我正在使用 Rails 4 2 3 我在控制器中有这一行 service XACTEService new Event 2015 06 01 Zoo 有问题的类在 app services XACTEService rb 中定义 然而 在访
  • XmlSerializer 列表项元素名称

    我有课PersonList XmlRoot Persons PersonList List
  • Web 应用程序的传入请求是否有配额?

    我正在运行一个脚本 该脚本通过 URL 访问更改 Google 表格中的行 部署为 Web 应用程序 例如macroUrl sheet SheetName key KeyName value ValueName 这非常适合我的需要 但我不确
  • 与 TypeScript 混合模式?

    我读过这篇文章 https justinfagnani com 2015 12 21 real mixins with javascript classes https justinfagnani com 2015 12 21 real m
  • 增加 HTML 正文中的光标大小

    有没有什么方法可以在基于浏览器的应用程序中以编程方式增加光标的大小CSS or jQuery 我可以用 CSS 改变光标的类型 就像这样 body cursor crosshair 但我在 CSS 中没有看到增加光标大小的规定 没有关于光标
  • 你能让 ERB 在渲染时正确缩进吗?

    我有几个部分包含在 Rails 中application html erb file 但生成的 HTML 不会保留我的缩进 格式 我被告知第一行以与调用相同的缩进级别呈现 partial html erb 但部分中的所有后续行都会左对齐 这
  • jQuery 图片库非功能性淡入淡出效果

    这是一个简单的图像库脚本 用于淡入和淡出带有背景图像的 div 它很慢而且不能正常工作 看起来所有图像都一起出现和消失 没有任何动画 该画廊应该将每张图像淡出到下一张图像中 function gallery timerp window se
  • Imagemagick 将每个边缘切掉 30px(宽度和高度可变)

    我需要将每边切掉 30px 左上右下 我试过了crop并且 chop 30x30但这似乎只在一方面起作用 convert verbose density 150 trim pdfs test test pdf quality 80 chop
  • 源集 - Groovy -> Kotlin DSL

    sourceSets main java srcDirs src main kotlin src main java res srcDirs src main res layouts activity src main res layout
  • 使用管理器和向量时出现内存错误

    我想创建一个包含多个对象的管理器 并且必须使用它才能实际创建对象 这些对象将其信息保存在智能指针中 这就是我的实现方式 struct Object std shared ptr
  • 使用按钮事件 tkinter 在画布中创建图像

    我需要向 Tkinter gui 中的按钮添加一个事件 该事件将在画布中创建图像 我该怎么做 谢谢大家 它有效 但我需要获取同一图像文件的动态数字图像 但每次我创建新图像时 旧图像都会被垃圾收集 我想不出该怎么办 我想在画布上有同一图像的多
  • Java:Eclipse 和 javac 中的泛型处理方式不同

    说我们有课 public class Entry
  • 如何在 php / Laravel 5 中解析 SimpleXMLElement?

    我使用 Guzzle 向后端的外部 API 发出 XML 请求 这是我创建 Guzzle 客户端的地方 client new Client GuzzleHttp Client 这是我提出请求的地方 request client gt req
  • 无法将ubi附加到mtd分区

    我们在基于 DM365 的定制板中使用 MT29F8G08ABABA 我们使用的是 NAND 启动 RootFS采用UBIFS格式 Below is basic achitecture of the NAND 我正在使用以下命令来创建 ub
  • 排队操作(不是效果)在一段时间后执行。

    我想知道是否有一种好的方法可以将 jQuery 函数排队以在设定的时间后执行 这不会暂停其他函数的执行 只会暂停链中后续函数的执行 也许我设想的一个例子可以说明 alert show wait 5000 lt this bit hide 我
  • 逐字符绘制文本时的字距调整问题

    我正在尝试逐个字符地绘制字符串 以便为由文本组成的形状添加灯光效果 while i line length c line substring i i 1 cWidth g getFontMetrics stringWidth c g dra
  • 数据读取器如何工作?

    我在想如果没有连接到 SQLServer SQLDataReader 不应该工作 我实验了这个场景 我执行 ExecuteReader 然后停止 SQLServer 服务并尝试迭代 DataReader 我期待的是一个例外 但它却给出了一个
  • 如何将 NestJS 中的服务注入到 typeorm 存储库中?

    我有一个UserRepository它处理在数据库前面创建 验证用户 我想对用户的密码执行哈希和验证 因此我为此创建了一个单独的服务 尝试遵循单一责任原则 其声明如下 Injectable export default class Hash
  • jeditable 意外触发嵌套项目上的 Draggable

    我使用jquery ui的draggable进行拖放 并且可编辑的 http www appelsiini net projects jeditable用于内联编辑 当我拖放一个也可编辑的元素时 在它被放置后 jeditable 立即启动并
  • 防止/限制方法继承

    我有一个应用程序 其中许多对象都扩展一个抽象类 该类定义了类似的方法create edit retrieve and delete 由于每个子类对这些函数都使用相同的逻辑 因此抽象类定义了默认行为 并且在需要增强的少数情况下 子类可以覆盖或