我想有一个允许通用类型的接口
public function persist($object);
但是我的具体实现有一个类型
public function persist(User $user);
根据我对PHP的理解,这是不可能的。从面向对象的设计角度来看,有人可以向我解释为什么我所做的是误导和错误。
编辑:我应该澄清一下,我知道类型提示及其工作原理我的问题是真的试图从OO角度理解当我希望我的具体实现采用不同类型的接口时我会出错
答案 0 :(得分:3)
接口的目的是成为类之间的契约。如果多个具体类实现了接口,那么它将是无用的,但是所有预期的不同输入都是如此。通过查看接口,您将不知道实现类所期望的输入类型,从而使接口基本上无用。您无法交换所有使用相同接口的不同具体类,因为它们都期望不同的输入(具有不同的接口)。
我无法用classB替换classA,并保证它们都可以工作,因为它们都具有相同的接口。这基本上会使接口对于人类已知的每个OOP模式都无用。
编辑示例
class CommandList {
public function addCommand(Command $command) {
$this->commands[] = $command;
}
public function runCommands() {
foreach ($this->commands as $command) $command->run($this);
}
}
interface Command {
public function run(CommandList $commandList);
}
class Hop implements Command {
public function run(CommandList $commandList) {
// hop here
}
}
class Skip implements Command {
public function run(CommandList $commandList) {
// skip here
}
}
了解界面如何作为合同?如果你打破了这种联系,那么实现Command的东西将无法互换。