有个问题是关于继承和接口的?~~~~~~~我有个class person implements ispeak{public function speak(){echo "人说话";}}类,
鸟类class bird implements ispeak{public function speak(){echo "鸟叫";}}类 
 接口ispeak{public function speak();}我一个艺人类 yrPerson extends person {} 
因为艺人可以学鸟叫  我现在想让艺人也可以鸟叫  但不要重复写代码public function speak(){echo "鸟叫";}
高手给讲讲!!!!急呀 经理总说我代码重复率太高了~~~~~

解决方案 »

  1.   

    不行呀~~我要继承person类 因为person类做了很多功能,我不能因为一个鸟叫就放弃更多的功能.
      

  2.   

    这里你需要一个简单工厂模式:<?php
    interface ispeak {
    public function speak();
    }
    class person implements ispeak {
    public function speak() {
    echo "人说话";
    }
    }
    class bird implements ispeak {
    public function speak() {
    echo "鸟叫";
    }
    }
    class dog implements ispeak {
    public function speak() {
    echo "狗叫";
    }
    }
    //各种叫....class Factory {
    public static function func($role){
    return new $role();
    }
    }
    class yrPerson{
    public function speak($a){
    $func=Factory::func($a);
    return $func->speak();
    }
    }$person=new yrPerson();
    $person->speak('dog');
    $person->speak('person');
    $person->speak('bird');
      

  3.   

    忘了要继承person类,小改一下class yrPerson extends person{
    //添加口技方法...
    public function show($a){
    $func=Factory::func($a);
    return $func->speak();
    }
    }$person=new yrPerson();
    $person->speak(); //自己说话
    $person->show('dog'); //学狗叫
    $person->show('bird'); //学鸟叫
    //接着学...
      

  4.   

     
    class yrPerson{
        public function speak($a){
            $func=Factory::func($a);
            return $func->speak();
        }
    必须要继承person类
    我不能因为叫的功能失去更多的功能~~~
      

  5.   

    Fatal error: Declaration of yrPerson::speak() must be compatible with that of ispeak::speak() in D:\myev\apache\htdocs\test1.php on line 27<?php
    interface ispeak {
        public function speak();
    }
    class person implements ispeak {
        public function speak() {
            echo "人说话";
        }
    }
    class bird implements ispeak {
        public function speak() {
            echo "鸟叫";
        }
    }
    class dog implements ispeak {
        public function speak() {
            echo "狗叫";
        }
    }
    //各种叫....class Factory {
        public static function func($role){
            return new $role();
        }
    }
    class yrPerson extends person{
        public function speak($a){
            $func=Factory::func($a);
            return $func->speak();
        }
    }$person=new yrPerson();
    $person->speak('dog');
    $person->speak('person');
    $person->speak('bird');?>
      

  6.   

    9楼不是已经修改过来了么
    艺人继承person类之后,就不能再定义speak方法