La classe C étend B. Et la classe B étend A1 ou A2, en fonction d'un argument du constructeur de C. Comment définir les classes A, B et C?Affecter une classe parente à une classe lors de l'exécution?
Répondre
Like deceze already points out, ce n'est pas possible avec l'héritage.
Vous pouvez utiliser runkit_class_adopt
-de PECL convertir une classe de base à une classe héritée, ajouter des méthodes ancestrales, le cas échéant mais runkit est quelque chose que vous ne voulez pas dans votre code de production.
L'approche OO propre à ce serait d'utiliser un Bridge pattern pour donner l'objet la mise en œuvre de la classe A à l'exécution et ainsi
découplage une abstraction de sa mise en œuvre afin que les deux peuvent varier indépendamment.
Comment ça marche
d'abord définir une interface tous les "parents" de B et B doit lui-même mettre en œuvre. L'interface doit contenir toutes les méthodes que vous voulez que B hérite. Je mets ces termes entre guillemets, car techniquement, ils ne sont ni parents, ni héritiers. Ensuite, définissez les classes A1 et A2 implémentant cette interface et ajoutez les méthodes demandées par l'interface
interface MyImplementation
{
public function doSomething();
// more methods …
}
Ensuite, créez votre classe B et faites en sorte qu'elle nécessite l'une des classes d'implémentation à l'initialisation.
abstract class B implements MyImplementation
{
protected $_implementation;
// more properties ...
public function __construct(MyImplementation $implementationObj)
{
$this->_implementation = $implementationObj;
}
public function doSomething()
{
return $this->_implementation->doSomething();
}
// more methods ...
}
Comme vous pouvez le voir, tous les appels vers les méthodes requises par notre interface sont déléguées à l'objet « parent » agrégé, donc en fonction de ce que vous avez passé dans B, vous obtiendrez des résultats différents. Maintenant, pour définir C, il suffit de lui faire accepter le nom de classe de la classe d'implémentation et de l'instancier dans C pour le passer au parent, par ex. B.
class C extends B {
public function __construct($bMethodImplementation) {
parent::__construct(new $bMethodImplementation);
}
}
et vous pouvez le faire
$c = new C('A1');
echo $c->doSomething(); // echoes A1
$c = new C('A2');
echo $c->doSomething(); // echoes A2
Étant donné que vous devez coder en dur la classe parent (class B extends A1
), cela n'est pas possible (malgré les extensions/hacks d'exécution, que je ne recommanderais pas d'utiliser). Regardez dans composition au lieu de l'héritage si vous avez besoin de cette flexibilité.
En effet, * toujours * favoriser la composition sur l'héritage! –
- 1. utilisant un élément de classe pour initialiser une classe parente
- 2. Comment convertir une classe parente en classe enfant
- 3. PHP surcharger une fonction d'une classe parente
- 4. Puis-je transmettre une classe enfant à une référence d'une classe parente?
- 5. Affecter une référence d'un nombre entier dans une classe
- 6. Classe Jquery select à l'intérieur de la classe parente
- 7. C# Affecter une variable à un appel de classe
- 8. C++ comment appeler une méthode de classe parente à partir d'une classe contenue?
- 9. symfony 1.4: question sur l'accès à une classe d'enfants d'une classe parente
- 10. Accès variable de classe statique de classe parente en Python
- 11. Ajout d'une variable tableau dans une classe parente en PHP
- 12. Quand et pourquoi une classe enfant déclare un membre d'instance statique de la classe parente?
- 13. Comment faire pour déterminer une classe parente dans Grails
- 14. XSLT - Ajouter une classe à quelque chose avec une classe?
- 15. Utilisation de jQuery pour affecter une classe active à une balise de zone (carte image)
- 16. affecter un type à une variable, utiliser une variable avec une classe statique générique
- 17. Transmettre une variable de classe à une autre classe
- 18. importer toutes les variables de classe parente
- 19. jquery classe annexant à une classe
- 20. Accéder à un décorateur dans une classe parente à partir de l'enfant en Python
- 21. Mapper une classe à une classe temporaire (sans certaines propriétés)
- 22. passage vide à une classe
- 23. comment passer une variable de classe int d'une classe à une autre classe dans cocos2d
- 24. Comment remplacer une fonction de classe parente par une fonction enfant en Perl?
- 25. Dans Gobject, comment remplacer la méthode de la classe parente appartient à une interface?
- 26. method_exists dans la classe parente php
- 27. Comment "passer" l'attribut de classe à une méthode de classe?
- 28. Comment vérifier si une sous-classe est une instance d'une classe lors de l'exécution?
- 29. Créer une classe héritée de la classe de base
- 30. Héritage des variables de classe à une sous-classe
titre de ce conflit question avec le contenu. lequel es-tu après? déterminer la classe de base ou comment définir les classes? – stillstanding