2011-07-01 7 views
-1

レベル2の継承した子から親のクラスメソッドをオーバーロードすることに苦しんでいます。私は事前にparentphp5で親メソッドをオーバーロードする

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(); 
?> 

child2のおかげで

+3

どうしますか? – KingCrunch

+0

だから何が問題なの?簡単なコードサンプルを提供できますか? – lonesomeday

+0

親クラスからメソッドを呼び出す方法が分かりませんか? –

答えて

0
$r->getSides(6,2); 

のメソッドをオーバーロードしたい

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

あなたの抽象クラスは、3つの引数を要求します!プラス関数は実際にはsetterメソッドです。 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'); 

あなたは私が受け入れられている方法として、過負荷__callにprintOneとprintTwoを持っていますが、これは

// 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' 

彼らはこれらのために使用されていないでしょうメソッドが既に定義されている場合、それらは既存のメソッドによって期待通りに処理されます。一方、メソッドが存在しないため、printThreeはオーバーロードされます。 printFourと同じですが、そのメソッドは引数を出力するつもりはありません。受け入れられたメソッドで定義した配列は何もしません。単なる配列です。これらのメソッドにいくつかのタスクを割り当てたり、私のようにエラーを返さなければなりません。

+0

質問は簡単です::子クラスから親のメソッドをオーバーロードする方法... ??その呼び出していない........私はオーバーロードする必要があります.....氏フェリックスキング – leela

+0

メソッドgetCoordinates()とgetSides()を2回呼び出しています!これらのメソッドは既に存在し、抽象クラスで定義されています。したがって、__callによるオーバーロードは効果がありません。 __call()は、オブジェクトコンテキストで** inaccessible **メソッドを呼び出すときにトリガーされます。私の理解する限り、あなたのメソッドにアクセスできます! –

関連する問題