在做项目时,我遇到了一个与选择正确的代码重用形式有关的问题,涉及到特质和抽象基类。我遇到了这样一个情况,我有多个抽象基类,但由于PHP的多重继承限制,只能从一个基类继承。重新思考这一点让我对我的设计产生了疑问,因此我想知道其他人如何解决这个问题。
以下是场景:
在我的项目中,我有两种计算:
1.简单计算
2.分组计算,这种情况下只是带有一些更多信息的简单计算
接下来是设置接口。
所以这里的第一个问题是:
1. 从 SimpleResultInterface 和 GroupedResultInterface 的接口关系来表达,GroupedResultBase 是否需要继承 SimpleResultBase?
我选择是,因为否则就需要复制 SimpleResultBase 的 getValue 方法。
现在我们可以表达:
1. GroupedResultInterface instanceof SimpleResultInterface (true) 2. GroupedResultBase instanceof SimpleResultBase (true) 3. SimpleResultBase instanceof SimpleResultInterface (true) 4. GroupedResultBase instanceof GroupedResultInterface (true)
接下来要开始具体实现时会遇到麻烦:
在这一点上没有具体类。现在我想要创建两个具体类,它们之间有一个关系,遵守接口定义。
这很好用,但我无法做到这一点。
以下是场景:
在我的项目中,我有两种计算:
1.简单计算
2.分组计算,这种情况下只是带有一些更多信息的简单计算
接下来是设置接口。
interface SimpleResultInterface{
public function getValue();
}
interface GroupedResultInterface extends SimpleResultInterface {
public function getGroupValues();
}
设置基类
为了避免代码重复,作为一种良好的设计形式,我设置了两个抽象基类。
abstract class SimpleResultBase implements SimpleResultInterface{
public function getValue(){
return 1;
}
}
abstract class GroupedResultBase extends SimpleResultBase implements GroupedResultInterface {
public function getGroupValues(){
return array(
"group1" => 1,
"group2" => 2,
"group3" => 3,
);
}
}
所以这里的第一个问题是:
1. 从 SimpleResultInterface 和 GroupedResultInterface 的接口关系来表达,GroupedResultBase 是否需要继承 SimpleResultBase?
我选择是,因为否则就需要复制 SimpleResultBase 的 getValue 方法。
现在我们可以表达:
1. GroupedResultInterface instanceof SimpleResultInterface (true) 2. GroupedResultBase instanceof SimpleResultBase (true) 3. SimpleResultBase instanceof SimpleResultInterface (true) 4. GroupedResultBase instanceof GroupedResultInterface (true)
接下来要开始具体实现时会遇到麻烦:
在这一点上没有具体类。现在我想要创建两个具体类,它们之间有一个关系,遵守接口定义。
class OEESimpleResult extends SimpleResultBase {
}
class OEEGroupedResult extends GroupedResultBase{
}
这很好用,但我无法做到这一点。
class OEESimpleResult extends SimpleResultBase {
}
class OEEGroupedResult extends OEESimpleResult,GroupedResultBase {
}
interface GroupedResultInterface
继承自SimpleResultInterface
。正如在接口定义中所述,每个分组的结果也是一个简单的结果。因此,我希望 OEEGroupedResult 也是一个 OEESimpleResult。
但是如果这样做,我就无法重用我的抽象基类 GroupedResultBase,因为不允许多重继承。这引发了以下问题:
- 看起来,抽象类中的类关系会导致继承链路冻结。是否最好删除抽象类并用 trait 替换它们,以便使用它们的具体类?
- 如果您有多个接口但只能继承一个基类,则提供默认实现的正确方法是什么?
- 这个问题在面向对象编程中似乎非常普遍,是否有任何最佳实践和建议来解决此问题?
- 实现接口的类是否应该像接口级别那样表达继承关系,还是仅凭借接口关系就足够了?在我的情况下,OEEGroupedResult 是否应该像它们的接口那样在类级别上表达与 OEESimpleResult 的关系?
感谢您的帮助 :)