覆盖从派生子类获取参数的方法

时间:2015-01-09 21:24:18

标签: php oop design-patterns

我最终得到了一个解决方案,其中我有两个层次的类。第一个(Greeters)层次结构中的类使用第二个类(用户)中的类。

继承人前:

class User {}
class Admin extends User {
    function getSecretMessage() {
        return "secret";
    }
}

class Greeter {
    public function hello(User $a) {
        echo "hello!";
    }
}

class AdminGreeter extends Greeter {
    public function hello(Admin $a) {
        parent::hello($a);
        echo "in addition heres a secret of mine: " . $a->getSecretMessage();
    }
}

这里我有User和Greeter,在PHP中我收到错误(严格)

“AdminGreeter :: hello声明必须与Greeter :: hello兼容”

我希望AdminGreeter::hello只使用来自更专业的类(管理员)的数据“扩展”Greeter::hello

我有什么其他选择来构建类似的PHP?

我想主要的问题是PHP不支持“方法重载”,因此如果我要将User实例发送到AdminGreeter它会中断。但是如果我有“方法重载”,如果在User实例中传递,则只会调用Greeter::hello

这可能是整体糟糕的设计,因为我最终遇到了这个问题,也许有人可以指出我为这个问题更好的设计。

正如我所说,我在开发Objective-C

时似乎有同样的问题

2 个答案:

答案 0 :(得分:0)

也许您可以考虑使用Traits代替这些“专门课程”

class User {
    protected $name;
    public function __construct($name) {
        $this->name = $name;
    }
    public function __toString() {
        return $this->name;
    }
}

trait Admin {
    function getSecretMessage() {
        return "secret";
    }
}

class Greeter {
    public function hello(User $a) {
        echo "Hello ", $a, "!", PHP_EOL;
    }
}

class AdminGreeter extends Greeter {
    use Admin;
    public function hello(User $a) {
        parent::hello($a);
        echo "in addition heres a secret of mine: " . $this->getSecretMessage();
    }
}

$x = new User('Natalie');
$y = new AdminGreeter;
$y->hello($x);

答案 1 :(得分:0)

尽可能保持原始代码:

interface iUser {
    public function getSecretMessage();
}

class Admin implements iUser {
    function getSecretMessage() {
        return 'secrete';
    }
}

class Greeter implements iUser{
    public function hello( iUser $a ) {
        echo 'hello';
    }

    public function getSecretMessage(){}
}

class AdminGreeter extends Greeter {
    public function hello( iUser $a ) {
        parent::hello($a);
        echo ' in addition heres a secrete of mine: ' . $a->getSecretMessage();
    }
}

AdminGreeter::hello( new Admin );

输出hello in addition heres a secrete of mine: secrete