【发布时间】:2021-05-16 05:08:09
【问题描述】:
给定如下的对象/接口层次结构
<?php
interface Event
{
public function getType(): string;
}
final class MyEvent implements Event
{
public function getType(): string
{
return 'MyEvent';
}
}
interface EventHandler
{
public function handle(Event $event): void;
}
final class MyEventHandler implements EventHandler
{
public function handle(MyEvent $event): void
{
// do something with the concrete MyEvent object...
}
}
在从EventHandler 接口实现handle 方法的方法中,是否可以键入更具体的MyEvent 提示?
我的 ide 将此标记为错误
方法“MyEventHandler::handle()”与方法“EventHandler::handle()”不兼容。
虽然我觉得以可扩展性的名义,但这应该是可能的......
实现方法的签名与接口中方法的签名不同,但是在运行时MyEvent不会被视为与Event相同吗?
显然,如果具体实现类型提示Event 接口,则没有问题,并且在运行时该方法将接受实现MyEvent 但随后我们失去了具体MyEventHandler 应处理事件的意图输入MyEvent。 Event 和 EventHandler 接口的实现可能非常多,因此我们在这里寻找的是尽可能明确,而不仅仅是在具体的句柄方法中键入提示接口。
如果接口和类型提示无法做到这一点,是否有另一种方法可以用抽象类实现它,同时保留强(ish)类型和传达意图?或者我们是否需要在 MyEventHandler 中使用显式方法来允许具体 Event 类的类型提示?
【问题讨论】: