gpt4 book ai didi

php - 改进 PHP 中的类结构而不是使用多重继承

转载 作者:行者123 更新时间:2023-12-04 05:07:00 25 4
gpt4 key购买 nike

我有一个设计问题,我的类(class)是这样设置的:

abstract class Advertiser        abstract class AdvertiserCampaign
| |
| |
class AdvUno extends Advertiser class AdvUnoCampaign extends AdvertiserCampaign
class AdvDos extends Advertiser class AdvDosCampaign extends AdvertiserCampaign
class AdvTre extends Advertiser class AdvTreCampaign extends AdvertiserCampaign

问题是 AdvUnoAdvUnoCampaign两者都需要一种其他人不需要的特殊身份验证方法。现在我把它放在 AdvUno ,但同样,它会被 AdvUnoCampaign 需要(以及以这种方式设置的许多其他类)。
  • 我做不到 AdvUnoCampaign延长 AdvUno因为在 PHP 中没有多重继承,而且因为它通常不是一个好的、干净的设计实践。
  • 如果我做 AdvertiserCampaign延长 Advertiser ,那么下面的所有扩展类( AdvUnoCampaignAdvDosCampaign 等)都必须实现一堆与它们无关的抽象方法,并且这些方法已经在每个 Advertiser 中实现了。类。

  • 简而言之,在这种情况下最好的设计实践是什么?我宁愿不只是将代码复制并粘贴到所有 AdvOne 中类。任何帮助或建议将不胜感激。谢谢!

    最佳答案

    Parallel Inheritance Hierarchies被认为是代码异味,应该重构的东西。

    Martin Fowler 在“重构”中建议:

    The general strategy for eliminating the duplication is to make sure that instances of one hierarchy refer to instances of the other. If you use Move Method and Move Field, the hierarchy on the referring class disappears.



    但我认为你可以更进一步。我不知道您的决定是基于什么为每个广告商及其广告系列制作子类,但我会质疑这个决定。要遵循的一个好习惯是 Favor Composition over Inheritance .

    你可以这样开始:
    class Advertiser
    {
    protected $authentication;
    }

    class AdvertiserCampaign
    {
    protected $authentication;
    }

    interface AdvertiserAuthentication
    {
    }

    class SpecialAuthenticationForAdvertiserUno implements AdvertiserAuthentication
    {
    }

    class NoSpecialAuthenticationForOtherAdvertisers implements AdvertiserAuthentication
    {
    }

    现在,广告商之间的第一个差异被移到另一个类中。继续其他差异,直到每个广告商都只是 Advertiser 的对象以不同的方式组成。广告系列也是如此。我想更具体一点,但如前所述,我不知道为什么您的广告商首先都有自己的类(class)。

    关于php - 改进 PHP 中的类结构而不是使用多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15417766/

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