【问题标题】:Does PHP have an exposed implementation for abstract interfaces?PHP 是否有针对抽象接口的公开实现?
【发布时间】:2015-03-17 19:58:24
【问题描述】:

我想到的概念来自Traversable 接口。这个接口不能直接实现,而是通过实现一个扩展它的接口来满足。

我可以声明一个无法实现的接口,而是使用公共接口进行扩展吗?

编辑:我意识到这种可能性毫无意义,因为它可以被第三方创建一个可以扩展基本接口的接口来规避。我正在寻找一种更简洁的方式来表达多态性。

例如:

abstract interface Vehicle
{
}

interface Car extends Vehicle
{
    public function drive(RouteProvider $routeProvider, $speed)
}

interface Boat extends Vehicle
{
    public function sail(BodyOfWater $water, $heading);
}

class PeopleMover
{
    public function move(Vehicle $vehicle)
    {
        if ($vehicle instanceof Boat) {
            // move people across bodies of water
        } elseif ($vehicle instanceof Car) {
            // move people along roads
        }
    }
}

【问题讨论】:

  • 不,它没有,但你能不能只声明一个普通的空Vehicle 接口并实现同样的事情?您依赖第三方而不是扩展/实现它。
  • 奇怪的例子。为什么不给这些方法起一个通用名称?
  • @KarolyHorvath 因为示例相当简化,这些方法将采用不同的所需参数。例如drive 方法可能需要路由发现服务,sail 方法可能需要知道水体。我的示例中的两个对象可能太接近而无法代表我的工作。 TraversableIteratorIteratorAggregate 是我想要实现的,他们做不同的事情,但如果你知道你在做什么,可以达到相同的结果。
  • @Bulk 这就是我在编辑后开始思考的问题。我想我最初认为最终用户获得某种早期警告而不是运行时错误会很好,但如果他们没有意识到它不会工作那么......他们可能有更大的问题
  • @SteveBuzonas 我不会太担心 - 任何实现空接口的人都是在自找麻烦;)

标签: php oop abstract


【解决方案1】:

接口的目的是定义应用程序如何访问您的对象,而不是控制对象的定义方式。这是您的对象向应用程序声明的一种方式,“我实现了这个接口,所以你可以相信我有这些方法。”

如果你想控制对象的定义方式,你应该使用带有抽象方法的抽象类。

【讨论】:

  • 我不想控制它的定义方式,这就是我想使用接口的原因。但是我想声明我的方法接受类似的项目,这些项目做不同的事情/需要不同类型的参数来达到相同的最终目标。简而言之,多态性......我会接受这个或那个,它们不会做同样的事情......但我可以让它们工作以达到相同的结果
  • 我认为你对多态性有些偏离。根据您的示例,您将拥有 Vehicle::transport(),而不是 Car::drive() 和 Boat::sail(),而 Car 和 Boat 有自己的实现。两者都需要相同的 transport() 方法签名,因此一个参数将是 Route 类型,然后您可以将其扩展为包括 RouteByRoad 和 RouteByWater。
  • 这是inclusion polymorphism aka subtyping 的正确陈述。在讨论我将实现作为一种没有parametric polymorphism 的函数重载手段的意图时,它将是ad-hoc polymorphism,其中subtyping 不一定是一种适合所有解决方案的尺寸。以我的例子为例,Vehicle 不是负责运输的,PeopleMover 是负责运输的,并且对不同运输方式的不同要求也各不相同。此外,我不希望 Chauffer 实现认为它可以飞行 Airplane 只是因为它们都可以传输。
  • 你是对的。所以你改变一些东西,这样你就可以提供一条路线,它会返回一辆合适的车辆。 IE。您提供 RouteByWater,然后您返回 Boat。你的代码不需要知道它提供什么类型的路线,也不需要知道返回什么类型的车辆,只要它们都共享一个公共接口。这就是多态性。多态性被定义为“面向对象编程中的一种模式,其中类在共享一个公共接口的同时具有不同的功能”。您的具体示例,您为每个类定义了不同的接口,因此这与多态性相反。
  • 我认为您误解了我想要实现的目标。我不是想实现你所想的多态性。我想要更多像foreach 这样的参数多态性,它需要一个数组、对象或TraversableTraversable 没有实现,但被IteratorIteratorAggregate 扩展。接口IteratorIteratorAggregate 做的事情不同,但是foreach 是一种多态方法,它对4 种不同的输入类型做同样的事情。
猜你喜欢
  • 2010-10-31
  • 1970-01-01
  • 2010-10-20
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多