2

我想要一个允许泛型类型的接口

public function persist($object);

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

public function persist(User $user);

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

编辑:我应该澄清一下,我知道类型提示以及它是如何工作的,我的问题实际上是试图从 OO 的角度理解当我希望我的具体实现对接口采用不同类型时我会出错的地方。

4

1 回答 1

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 的东西就不能互换。

于 2012-05-03T15:42:03.527 回答