2009-10-29 7 views
1

J'ai un système de modèles:Emuler héritage multiple en php

abstract class R00_Model_iUnique { } 
abstract class R00_Model_iFamilyUnique extends R00_Model_iUnique { } // for models with hierarchy 
abstract class R00_Model_iTaggedUnique extends R00_Model_iUnique { } // for models with tags 

// and, for example 
class R00_Model_User extends R00_Model_iUnique { } 
class R00_Model_Comment extends R00_Model_iFamilyUnique { } 
class R00_Model_Post extends R00_Model_iTaggedUnique { } 

Il va être R00_Model_iCommentableUnique et R00_Model_Post veut être héritée de celle-ci. Mais ce n'est pas possible, c'est déjà hérité de R00_Model_iTaggedUnique, et je ne pense pas qu'il soit intelligent d'hériter R00_Model_iTaggedUnique de R00_Model_iCommentableUnique ou vice versa. Je n'ai imaginé qu'une seule idée pour l'implémenter, mais j'ai quelques doutes. Peut-être pourriez-vous me parler de méthodes intelligentes ou critiquer cette méthode?


Je pensais à faire R00_Model_i * unique non classes, mais les interfaces, et créer des objets d'aide, tels que R00_Model_Helper_iUnique (peut-être est un Patern commun, et il y a un nom cool, je ne pense pas " Helper 'sera cool là-bas?). Ensuite, dans R00_Model_iUnique, créez __call(), qui vérifie toutes les Interfaces d'un objet appelé et recherche une méthode appelée dans l'assistant.

Ou il y a trop de réflexion et d'autres choses lentes, n'est-ce pas?

+0

Je pense que concevoir la classe comme une interface est un bon début. –

+0

tu veux dire, ma solution est juste ou tu veux dire, je devrais leur faire seulement une interface et oublier leurs méthodes? –

+1

En tant que commentaire général nommant vos classes R00_Model_ * est une mauvaise idée. J'imagine que cela signifie que vous aurez R00_View_ * et R00_Controller_ * Mais vous voyez Model, View et Controller ** ne sont pas essentiels à votre domaine de problème ** Ils sont un artefact artificiel que nous faisons en tant que développeurs pour nous aider à organiser code. Mais le but du Modèle est précisément de * modéliser * votre domaine. En évitant cette convention de dénomination, votre code sera plus facile à comprendre et à déboguer à l'avenir. – elviejo79

Répondre

1

Vous êtes dans la bonne direction en utilisant une interface et des aides (composition).

C'est précisément l'une des raisons pour lesquelles l'un des principes du Design Patterns Book (GoF) est "Favoriser la composition sur l'héritage". La composition vous donnera la flexibilité dont vous avez besoin pour utiliser des méthodes de classes différentes Dans la classe dont vous avez besoin.