2

ジェネリック型を許可するインターフェイスが欲しい

public function persist($object);

しかし、私の具体的な実装は型を持つ

public function persist(User $user);

私がPHPについて理解していることから、これは不可能です。オブジェクト指向設計の観点から、誰かが私がやっていることは間違った方向に進んでいて間違っている理由を説明してくれませんか?

編集:明確にする必要があります。タイプヒントとそれがどのように機能するかを認識しています。私の質問は、具体的な実装でインターフェイスに別のタイプを持たせたいときに、OOの観点から間違っているところを理解しようとしています。

4

1 に答える 1

3

インターフェイスの目的は、クラス間の契約になることです。複数の具体的なクラスがそれを実装している場合、インターフェイスは役に立たないでしょうが、すべてが異なる入力を期待していました。インターフェースを見ると、実装クラスが期待する入力のタイプがわからないため、インターフェースは基本的に役に立たなくなります。すべて同じインターフェースを使用する異なる具象クラスを交換することはできません。それらはすべて異なる入力を想定している (異なるインターフェースを持っている) からです。

classA を classB に置き換えることはできませんでしたが、どちらも同じインターフェースを持っているため、両方が機能するという保証がありました。これは基本的に、人間が知っているすべての 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 に答える