2013-06-18 17 views
9

ho 2 classi:PHP - estendere metodo come estensione di una classe

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

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

In questo modo, se chiamo uomo-> passeggiata(), funziona solo with2legs;

Ma io voglio la corsa della passeggiata dei genitori; pure.

So che posso modificarlo in questo modo:

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

Ma il problema è, ho molte sottoclassi e io non voglio mettere parent :: passeggiata(); in ogni bambino cammina(). C'è un modo per estendere un metodo come estendo una classe? Senza forzare ma estendendo davvero il metodo. O ci sono alternative migliori?

Grazie.

risposta

19

userei "hook" e abstraction concetti:

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; 
    } 
} 

questo modo non mi resta che chiamare:

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

per fare un bambino a piedi la sua strada ...


Vedi Template method pattern.


+0

Questo è fantastico, non avrei mai pensato di chiamare un metodo figlio da genitore! – Tony

+0

Sì, questo è un disegno che uso spesso. Abbastanza utile in determinate circostanze. –

+1

@OneTrickPony Non so cosa si aspetta Tony e qual è il suo vero caso d'uso che lo ha spinto a fare questa domanda, ma questo è un modo di fare. E nel peggiore dei casi, ha scoperto una nuova possibilità ;-). Ora di andare a letto per me ... Salute! –

Problemi correlati