php - 防止/限制方法继承

标签 php oop inheritance

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

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

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

那么,如果允许大量类都继承一组方法,但其中一些类不继承所有方法,那么您建议的最佳方法是什么? (有问题的应用程序是用 php 编写的,但是来自任何语言的一般 OOP 技术仍然有用)。

最佳答案

创建一个不可 rebase 类作为基类的子类。 immutable-base 应该实现 final重写 edit() 和 delete(),它们什么都不做或抛出错误。

最后,保证所有不可变的 child 都不能编辑或删除

这个策略的好处

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

  • 通过修改它扩展的内容轻松地将对象从不可变更改为不可变并再次变回不可变

关于php - 防止/限制方法继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8830623/

相关文章:

php - 为什么 sprintf 给出星号而不是我的格式化字符串?

OOP:setter 应该是私有(private)的吗?

C++ 纯虚void

java - 待遇到类内场。通过 getter 还是显式?

javascript - 如何从 JavaScript 中的子类调用父类的方法,以便可以访问父类的局部变量?

c# - .NET 中的类可以继承自 LambdaExpression 吗?还是不推荐这样做?

c++ - 创建未知类的对象(两个继承类)

php - Symfony 1.4 通过 SSL 连接到 mysql

php - 这个sql语句怎么写

javascript - 如何将翻译后的文本插入数据库php