2010-07-02 4 views
1

Disons que j'ai quelque chose comme ceci:Laquelle de ces techniques d'héritage est une meilleure pratique?

abstract class Parent 
{ 
    protected function foobar($data) 
    { 
     //do something with data 
     return $result; 
    } 
} 

class Child extends Parent 
{ 
    public function foobar() 
    { 
     $data = ...; 

     return parent::foobar($data); 
    } 
} 

Comme vous pouvez le voir, foobar est génériquement défini dans Parent, puis Child transmet des données spécifiques à chaque classe dans le parent qui renvoie le résultat. La raison en est que chaque classe enfant de parent a ses propres données, mais la méthode elle-même reste la même - seul le paramètre est différent. L'enfant expose également publiquement la méthode.

Est-ce une meilleure idée de faire quelque chose comme ceci, où je crée une méthode du même nom dans le parent et l'enfant? Ou est-ce que je devrais peut-être créer une méthode _foobar dans la classe Parent et avoir la méthode de Child?

Répondre

2

Le Le Liskov Substitution Principle déclare que:

Si pour chaque objet o1 de type S il est un objet o2 de type T tel que pour tous les programmes P définis en termes de T, le comportement des P est inchangé lorsque o1 o2 est substitué à S est alors un sous-type de T. »

sens que: les fonctions qui utilisent des pointeurs ou des références à des classes de base m être capable d'utiliser des objets de classes dérivées sans le savoir.

Dans votre exemple vous violez cela en changeant la signature de la méthode foobar (overriding). foobar devrait avoir la même signature au monde extérieur, il peut faire quelque chose de différent avec une intention connexe. Si vous avez besoin d'une autre fonction, nommez-la quelque chose de différent, votre enfant ne devient plus une isa du parent.

+0

Je ne pense pas qu'il ait outrepassé cette fonction (ce n'est pas virtuel) mais l'a surchargé. ça fait la différence;) – Arseny

2

Tout d'abord, il n'y a pas de raison de donner un nom commun. Appelez le parent quelque chose comme "doFoobarOnGivenData" (vous obtenez ma dérive).

De plus, est-ce que tous les enfants ont exactement le même code ou les données sont-elles requises différemment pour chacun? Il serait peut-être préférable d'avoir une seule méthode foobar publique dans le parent, qui appelle un résumé "getDataForFoobar". Chaque enfant n'aurait alors qu'à modifier la façon dont les données sont acquises.

1

Il s'agit davantage de créer une surcharge que d'utiliser une méthode avec un nom similaire (mais différent). Il n'y a pas de vraie "bonne" réponse à cela, bien que je préfère la surcharge.

Questions connexes