gpt4 book ai didi

php - 用于代码重用的特征与抽象类

转载 作者:行者123 更新时间:2023-12-04 03:19:53 26 4
gpt4 key购买 nike

在处理一个项目时,我偶然发现了一个问题,该问题涉及根据特征与抽象基类选择正确的代码重用形式的正确方法。我遇到了这样一种情况,我有多个抽象基类,但由于 PHP 的多重继承限制,只能从一个继承。重新思考这让我质疑我的设计,所以我想知道其他人会如何解决这个问题。

以下场景

在我的项目中我有两种计算方式

  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. GroupedResultBaseSimpleResultInterfaceGroupedResultInterface的接口(interface)关系表达上是否需要继承SimpleResultBase

我选择了是,否则我将不得不从 SimpleResultBase 复制 getValue 方法

我们目前拥有的

现在我可以 epxpress

  1. GroupedResultInterface instanceof SimpleResultInterface ( true )
  2. GroupedResultBase instanceof SimpleResultBase ( true )
  3. SimpleResultBase instanceof SimpleResultInterface ( true )
  4. GroupedResultBase instanceof GroupedResultInterface ( true )

从问题开始的地方具体化

此时还没有具体的类。现在我想制作两个具体的类,它们在接口(interface)定义方面有关系。

class OEESimpleResult extends SimpleResultBase {

}

class OEEGroupedResult extends GroupedResultBase{

}

这很好用,但我不能做的是这个

class OEESimpleResult extends SimpleResultBase {

}

class OEEGroupedResult extends OEESimpleResult,GroupedResultBase {

}

interface GroupedResultInterface extends SimpleResultInterface

As above noted in the interface definiton. Each grouped result is also a simple result. So i would have expected that OEEGroupedResult also is a OEESimpleResult

但是当我这样做时,我不能重用我的抽象基类 GroupedResultBase 因为不允许多重继承。这让我想到了以下问题。

  1. 抽象类中的类关系似乎卡住了继承链。删除抽象类并用使具体类使用它们的特征替换它们会更好吗?
  2. 如果您有多个接口(interface)但只能从一个基类继承,那么提供默认实现的正确方法是什么?
  3. 这个问题在 oop 中似乎很常见,那么有什么最佳实践和建议可以解决这个问题吗?
  4. 实现接口(interface)的类是否也应该像接口(interface)级别那样以继承的形式表达关系,或者仅接口(interface)关系就足够了吗?在我的例子中,OEEGroupedResult 应该在类级别上表达与 OEESimpleResult 的关系,就像它们在接口(interface)级别上的接口(interface)一样。

谢谢你的帮助:)

最佳答案

当您使用 oop 风格工作时,您可能听说过 SOLID 原则。因此,您的设计打破了以下字母 S、I、D,并有可能打破 O 和 L。

那么你是如何破坏“S”的:就在这里!

class OEEGroupedResult extends OEESimpleResult,GroupedResultBase {

}

突然或幸运的是 php 不允许这样做,但是您的类会提供一些额外的独立逻辑,因此您至少有两个理由来更改它。但是,是的,这是因为

interface GroupedResultInterface extends SimpleResultInterface {
public function getGroupValues();
}

这是您的 I 字母中断。解决方案非常简单:考虑您的 GroupedResultInterface 真正需要的方法并将其放入其中,真的 意味着这些方法必须完成相同的工作。它们不像你在这里打破字母 D 那样:

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,
);
}
}

您的类 class GroupedResultBase 依赖于另一个类的具体方法。但是你会在接口(interface)隔离之后很快修复它。

注意。当我无法更改供应商类中的某些内容时,我正在使用特征。仅有的。这只是我,但当我认为这种特质会帮助我时,那么建筑就出了问题。当然,这取决于您。

小链接:https://en.wikipedia.org/wiki/SOLID_(object-oriented_design)

玩得开心!

关于php - 用于代码重用的特征与抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39100263/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com