使库使用其类的自定义实现

时间:2018-04-11 14:49:24

标签: php oop polymorphism programming-languages

有一个包含这些类的库:

  • ExternalLibrary / DefaultObject
  • ExternalLibrary / ObjectConsumer
  • ExternalLibrary / ObjectEater
  • ExternalLibrary / ObjectCuddler
  • ExternalLibrary / ObjectF ** ker的

其中

namespace ExternalLibrary;

class DefaultObject {}

class ObjectConsumer {

    protected $object;

    // the oter Object<...> classes have all the same constructor
    public function __construct()
    {
        $this->object = new DefaultObject;
    }

    public function compareWith(DefaultObject $comparand)
    {
        // just a method in order to have another dependency in the type-hinting
    }
}

我的库想要扩展外部库的概念和功能:

  • 在MyLibrary / DefaultObject

其中

namespace ExternalLibrary;

use ExternalLibrary\DefaultObject as BaseDefaultObject;

class DefaultObject extends BaseDefaultObject {
    // marvelous additional concepts on top of the base concepts
}

鉴于我不想包装/扩展/覆盖/重新定义所有可能使用 DefaultObject 的类:

  • 我在PHP中有哪些选项,以便在依赖外部库时让我的自定义对象在我的库中随处可用?

(例如 ObjectEater 依赖 MyLibrary / DefaultObject

  • 那么其他语言呢?那会更容易吗?
  • 如果我是外部库的所有者并且可以更改其代码呢?

2 个答案:

答案 0 :(得分:1)

问题的根源是该库的代码是糟糕的。它与DefaultObject类名称紧密耦合(因为它在构造函数中启动它,而不是期望它作为依赖项)。

绕过它的唯一方法是实际搞乱自动加载器(假设这个神奇的库没有在同一个文件中定义多个类),如果它甚至使用它。

但无论如何,我建议开始研究如何从项目中删除对该库的依赖。这构成了巨大的发展风险。

答案 1 :(得分:0)

只是为了补充其他正确的答案/评论。

  

我在PHP中有哪些选项,以便在依赖外部库时让我的自定义对象在我的库中随处可用?

你没有别人的选择 - 你可能做的任何事情都是如此愚蠢,你甚至不应该考虑它。

  

那么其他语言呢?那会更容易吗?

我不是很多语言的专家,但我想不出在其他语言中这会更容易。使用者类在其构造函数中实例化特定类,并且通过这样做,他们故意让您无法覆盖该行为。他们想要使用该类的实例,就是这样......

  

在这种情况下,我是外部库的所有者,可以更改其代码吗?

您将使用众所周知的Dependency Injection方法,使用接口而不是实现获得奖励积分,并使构造函数参数可选,以便与使用这些类的任何其他代码保持向后兼容 - 类似的东西:

class ObjectConsumer {

    protected $object;

    public function __construct(DefaultObjectInterface $object = null)
    {
        $this->object = $object !== null ? $object : new DefaultObject();
    }

    public function compareWith(DefaultObjectInterface $comparand)
    {
    }
}