【发布时间】:2015-09-10 01:03:07
【问题描述】:
我正在寻找一些设计建议。例如,假设我想为 CRUD 操作创建一个抽象类。我有继承该基类的具体实现。我的一些实现是只读的。有些不允许删除。有些允许所有 CRUD 操作。但在它们的核心,所有这些方法在每个实现之间都是相同的。我希望其他调用这些类的类能够知道每个实现的能力。我能想到的选择是:
将所有代码和公共方法放入抽象类。每个实现都存储一个它可以做什么的列表 {create, read, update} 并公开一个像 AvailableMethods() 这样的公共方法,它将简单地返回该列表。在这些方法的实现中,它检查该方法是否可用,如果不可用则抛出异常。例如,当调用 create() 时,它会检查“create”是否在可用方法列表中。出于多种原因,这样做似乎不正确。首先,对我来说,我认为任何对象都不应该公开一个会持续抛出异常的方法(假设它不是允许的方法)。
将所有实现放入抽象类中受保护的处理程序方法(handleCreate()、handleRead() 等)中。为每个方法创建接口,例如 ICanCreate 有一个 create() 方法,ICanRead 有一个 read() 方法。具体类实现所需的接口并声明调用处理程序的公共方法。调用类可以简单地询问该类是否实现了所需的接口。这似乎是一个更好的解决方案,但我觉得有数百个对象和许多不同的组合,我将复制/粘贴一千个公共方法。有一点我想整合到更多的基类中,比如 ReadOnly、NoDelete、FullAccess 或类似的东西。这看起来不错,但即使只有四个选择,也有很多组合。这只是一个例子。我可能还有其他功能,其中有 6 或 8 个方法。
还有其他我忽略的设计选项吗?我以与语言无关的方式询问,但如果有任何语言特定的方法可以更好地处理这个问题,我正在使用 PHP。
【问题讨论】:
标签: inheritance design-patterns interface