2009-10-29 1 views
1

У меня есть система моделей:Эмуляция множественного наследования в 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 { } 

Там собирается быть R00_Model_iCommentableUnique и R00_Model_Post хочет быть унаследован от него. Но это невозможно, оно уже унаследовано от R00_Model_iTaggedUnique, и я не думаю, что умно унаследовать R00_Model_iTaggedUnique от R00_Model_iCommentableUnique или наоборот. Я придумал только одну идею, как ее реализовать, но у меня есть некоторые сомнения. Может быть, вы можете рассказать мне о некоторых умных методах или критиковать этот метод?


Я придумал сделать R00_Model_i * Уникальным не классы, а интерфейсы, а также создавать вспомогательные объекты, такие как R00_Model_Helper_iUnique (возможно, это общий лаковое, и есть классное имя, я не думаю, что " Помощник будет там круто?). Затем в R00_Model_iUnique создайте __call(), который проверяет все интерфейсы вызываемого объекта и ищет вызываемый метод в помощнике.

Или слишком много отражений и других злых медленных вещей, не так ли?

+0

Я думаю, что создание класса в качестве интерфейса - это хорошее начало. –

+0

Вы имеете в виду, мое решение правильно, или вы имеете в виду, я должен сделать их только интерфейсами и забыть о своих методах? –

+1

Как общий комментарий, назвавший ваши классы R00_Model_ * - плохая идея. Я предполагаю, что это означает, что у вас будут R00_View_ * и R00_Controller_ * Но вы видите, что Model, View и Controller ** не являются существенными для вашей проблемной области ** Это искусственный артефакт, который мы, как разработчики, делаем, чтобы помочь нам организовать код. Но цель Модели - именно * модель *, что ваш домен. Избегая этого соглашения об именах, ваш код будет проще в будущем понимать и отлаживать. – elviejo79

ответ

1

Вы находитесь в правильном направлении, используя интерфейс и помощники (состав).

Это как раз одна из причин, почему принципы принципов дизайна (GoF) составляют «Офорт композиции над наследованием».

Композиция предоставит вам гибкость, необходимую для использования методов разных классов. В классе, в котором вы нуждаетесь.

 Смежные вопросы

  • Нет связанных вопросов^_^