2013-06-18 17 views
9

Ich habe 2 Klasse:PHP - erweitert Methode, wie eine Klasse erweitern

class animal{ 
    public function walk(){ 
     walk; 
    } 
} 

class human extends animal{ 
    public function walk(){ 
     with2legs; 
    } 
} 

Auf diese Weise, wenn ich human- nennen> Fuß(), es läuft nur with2legs;

Aber ich möchte den Lauf der Eltern gehen; auch.

Ich weiß, dass ich es auf diese Art und Weise ändern kann:

class human extends animal{ 
    public function walk(){ 
     parent::walk(); 
     with2legs; 
    } 
} 

Aber das Problem ist, ich habe viele Subklassen und ich will nicht parent :: Fuß() setzen; in jedes Kind gehen(). Gibt es eine Möglichkeit, wie ich eine Klasse erweitern kann? Ohne zu übersteuern, aber die Methode wirklich zu erweitern. Oder gibt es bessere Alternativen?

Danke.

Antwort

19

würde ich "hook" und abstraction Konzepte verwenden:

class animal{ 

    // Function that has to be implemented in each child 
    abstract public function walkMyWay(); 

    public function walk(){ 
     walk_base; 
     walkMyWay(); 
    } 
} 

class human extends animal{ 
    // Just implement the specific part for human 
    public function walkMyWay(){ 
     with2legs; 
    } 
} 

class pig extends animal{ 
    // Just implement the specific part for pig 
    public function walkMyWay(){ 
     with4legs; 
    } 
} 

Auf diese Weise muss ich nur noch rufen:

// Calls parent::walk() which calls both 'parent::walk_base' and human::walkMyWay() 
$a_human->walk();  
// Calls parent::walk() which calls both 'parent::walk_base' and pig::walkMyWay() 
$a_pig->walk(); 

auf ein Kind seinen Weg zu machen gehen ...


Siehe Template method pattern.


+0

Das ist großartig, ich dachte nie, eine Kindmethode vom Elternteil zu nennen! – Tony

+0

Ja, das ist ein Design, das ich oft benutze. Ziemlich handlich unter bestimmten Umständen. –

+1

@OneTrickPony Ich weiß nicht, was Tony erwartet und was sein wirklicher Anwendungsfall ist, der ihn dazu gebracht hat, diese Frage zu stellen, aber das ist eine Möglichkeit. Und im schlimmsten Fall hat er eine neue Möglichkeit entdeckt ;-). Schlafenszeit für mich ... Prost! –

Verwandte Themen