перегрузка родительского метода в php5 - PullRequest
0 голосов
/ 02 июля 2011

Я поражен перегрузкой методов класса родителя от унаследованного потомка на уровне 2.

abstract class parent
  -> child1 extends parent
    -> final class child2 extends child1

Я хочу перегрузить методы parent в child2

abstract class Shape
{
    protected $length;
    protected $height;
    protected $a;
    protected $b;
    protected $c;
    public function getCoordinates($length,$height)
    {
        $this->length=$length;
        $this->height=$height;
    }
    public function getSides($a,$b,$c)
    {
        $this->a=$a;
        $this->b=$b;
        $this->c=$c;
    }

    abstract public function area();
    abstract public function perimeter();
    abstract public function display();

}

class rectangle extends Shape
{
    public function area()
    {
        return round(($this->length)*($this->height),2);
    }
    public function perimeter()
    {
        return round(2*(($this->a)+($this->b)),2);
    }
    public function display()
    {
        echo "area is :". rectangle::area() . "<br>";
        echo "perimeter is : ". rectangle::perimeter() ."<br>";
    }
}



final class triangle extends rectangle
{
    function __call($method_name, $arguments) // this is wrong ........please modify here to call area(),which is in shape class();
      {
          $accepted_methods = array("getCoordinates","area","perimeter");
      }

      public function area()
    {
        return round((($this->length)*($this->height)*($this->width)/2),2);
    }
    public function perimeter()
    {
        return round((($this->a)+($this->b)+($this->c)),2);
    }
    public function getCoordinates($length,$height,$width)
     {
         $this->length=$length;
         $this->height=$height;
        $this->width=$width;
      }
    public function display()
    {
        echo "area is :". triangle::area() . "<br>";
        echo "perimeter is : ". triangle::perimeter() ."<br>";
    }
 }


$r=new rectangle();
$r->getCoordinates(1,2,4);
$r->getSides(6,2);
$r->display();


$ot = new triangle();
$ot->getCoordinates(1,2,4);
$ot->getSides(6,2,3);
$ot->display();
?>

Заранее спасибо

1 Ответ

0 голосов
/ 02 июля 2011
$r->getSides(6,2);

Ваш абстрактный класс требует трех аргументов! Плюс функция на самом деле является методом установки. Вы должны назвать его setSides () ;. То же самое с getCoordinates ().

Обновление : Я думаю, вы путаете наследование с перегрузкой. Вот пример для перегрузки с помощью __call. Я предполагаю, что это не то, что вы пытаетесь сделать, а то, что вы имеете в своем примере. Может быть, это поможет.

abstract class overloadTestAbstract {

    public function printOne($show) {
        echo __METHOD__ . ': ' . $show . '<br />';
    }

}

class overloadTestOne extends overloadTestAbstract {

    public function __call($method,$arguments) {
        $methods = array('printOne','printTwo','printThree');
        if ( in_array($method,$methods) ) {
            echo __METHOD__ . ' :OVERLOAD METHOD: ' . $arguments[0] . '<br />';
        } else {
            echo 'We are so sorry, but this method is available';
        }
    }

    public function printTwo($show) {
        echo __METHOD__ . ': ' . $show . '<br />';
    }

}

Тогда, если вы сделаете это:

$test = new overloadTestOne();

$test->printOne('Hello World');
$test->printTwo('Goodbye World');
$test->printThree('Hello World, again');
$test->printFour('Goodbye World, again');

вы получите это

// print results 
'overloadTestAbstract::printOne: Hello World'
'overloadTestOne::printTwo: Goodbye World'
'overloadTestOne::__call :OVERLOAD METHOD: Hello World, again'
'We are so sorry, but this method is available'

Хотя у меня есть printOne и printTwo в перегрузке __call как принятые методы, они не используются, потому что эти методы уже определены, они обрабатываются существующими методами, как и ожидалось. С другой стороны, printThree перегружается, потому что метод не существует. То же самое с printFour, но этот метод не предназначен для вывода аргумента. Массив, который вы определили с помощью принятых методов, ничего не делает. Это просто массив. Вы должны назначить какое-то задание этим методам или вернуть ошибку, как я.

...