【发布时间】: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方法可能需要知道水体。我的示例中的两个对象可能太接近而无法代表我的工作。Traversable与Iterator和IteratorAggregate是我想要实现的,他们做不同的事情,但如果你知道你在做什么,可以达到相同的结果。 -
@Bulk 这就是我在编辑后开始思考的问题。我想我最初认为最终用户获得某种早期警告而不是运行时错误会很好,但如果他们没有意识到它不会工作那么......他们可能有更大的问题
-
@SteveBuzonas 我不会太担心 - 任何实现空接口的人都是在自找麻烦;)