Question

L'idée est de créer un arbre DOM comme. Mais il y a certaines restrictions, que seuls certains types peuvent réellement contenir l'autre.

Je veux utiliser une interface | classe abstraite | superclasse pour mettre en œuvre certaines js-fonctions bien connues comme appendChild, replaceChild etc

.

J'utilise la page classes, bloc et élément, où les pages peuvent contenir des blocs et des blocs peuvent contenir soit des blocs ou des éléments.

Exemple:. La page est une page Web, le bloc pourrait être un élément de la liste et l'élément pourrait être un élément d'élément de liste

Mais ces objets contiennent plus que html-données et les concepts va au-delà de la représentation HTML ordinaire. Il est une idée générale des éléments de gestion, wether ils ont une représentation réelle ou sont tout simplement des objets abstraits. Le concept lui-même travaille pour de nombreuses hiérarchies différentes.

Ce que je veux atteindre est de réutiliser code une grande partie de la classe parente possible (l'ajout d'un enfant est fondamentalement la même chose pour toutes les classes) mais diffèrent du type des suggestions à faire correspondre les types autorisés à ajouter un enfant.

Il existe quatre façons je trouve moi-même:

  1. J'utilise une interface, ce qui me permet de taper allusion à la superclasse mais pas modifier.
  2. J'utilise une superclasse avec des méthodes publiques, donc je peux redéfinir les conseils de type (ce qui est tout à fait contre les pratiques habituelles quand heriting conditions préalables).
  3. J'utilise une superclasse avec des méthodes protégées, ce qui semble encore être tout à fait bizarre.
  4. je me débarrasser de tout superclasse et définir tout près de la même classe plusieurs fois.
  5. J'utilise une méthode pour vérifier le type, malgré la fonction d'indices de type.

Alors, si quelqu'un est toujours prêt à répondre, je suis heureux pour toute proposition, idée ou indice, quelle option choisir. J'espère que je pourrais décrire le problème assez bien.

Et s'il y a quelque chose que je manqué Je suis reconnaissant de l'entendre;)

code

façon superclasse (travaux, mais les pauses condition préalable héritant pratique)

class Base {

    public|protected function appendChild(Base $child) {
        // do stuff
    }
}

class Block extends Base {

   public function appendChild(Block $child) {
       parent::appendChild($child);
   }

}

Interface façon (ne fonctionne pas. Il ne doit pas)

interface Interface1 {

    public function appendChild(Base $child);

}

class Base implements Interface1 {

    public|protected function appendChild(Base $child) {
        // do stuff
    }
}

class Block extends Base{

   public function appendChild(Block $child) {
       parent::appendChild($child);
   }

}

Edité parties sont en gras

Était-ce utile?

La solution

Interface fait le plus de sens pour moi. Vous pouvez avoir une classe qui joue plusieurs rôles, car il peut implémenter plusieurs interfaces.

// you don't need any methods in the interfaces
class Foo implements Inline, Block {} 

fonctionne aussi bien avec:

appendChild(Inline $foo); and appendChild(Block $foo);

et les interfaces peuvent étendre les uns des autres, donc il peut y avoir une interface commune pour tous vos objets.

Vous pouvez toujours utiliser l'héritage pour réutiliser la mise en œuvre, et vous aurez la flexibilité d'utiliser inhertiance arbre strictement pour la réutilisation de la mise en œuvre, non limitée par la logique de votre page (vous ne serez jamais obligé de faire StaticSimpleton étendre HeavyDatabaseyWidget).

Si non interfaces, je serais aller pour l'option 5: il suffit de faire appendChild appel $child->canBeChildOf($this) et / ou $this->accepts($child). Encore une fois, la logique et la mise en œuvre seront indépendants, et vous aurez beaucoup de liberté avec votre logique.

PHP fait taper des contrôles à l'exécution TMIE, donc l'utilisation du système de type ne vous achète pas beaucoup de toute façon.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top