实现具有不同类型的接口

时间:2012-05-03 15:17:35

标签: php oop

我想有一个允许通用类型的接口

public function persist($object);

但是我的具体实现有一个类型

public function persist(User $user);

根据我对PHP的理解,这是不可能的。从面向对象的设计角度来看,有人可以向我解释为什么我所做的是误导和错误。

编辑:我应该澄清一下,我知道类型提示及其工作原理我的问题是真的试图从OO角度理解当我希望我的具体实现采用不同类型的接口时我会出错

1 个答案:

答案 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的东西将无法互换。