![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| Alone |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 11.5.2003 Где: Dnepropetrovsk, U A Репутация: нет Всего: 6 |
-------------------- |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
А что именно?
Зачем создавать объект внутри? |
|||
|
||||
| Alone |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 11.5.2003 Где: Dnepropetrovsk, U A Репутация: нет Всего: 6 |
Ну, скажем, класс а является абстрактным базовым, и от него унаследованы х классов.
В зависимости от определенного условия, необходимо взаимодействовать с классом, имя и реализация которого неизвестна (паттерн abstract_factory). Пример: $db1 = &new DbProvider("pgsql"); $db2 = &new DbProvider("mysql"); В зависимости от входного параметра будут созданы объекты необходимых типов (mysql, pgsql), кои являются прямыми наследниками DbProvider Заодно экономия по памяти... -------------------- |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
Я бы делал проще.
Объявлял один класс, если это так надо, и описывал второй класс, причем второй наследует свойства и методы первого. И создаешь ты один объект от описания второго класса. |
|||
|
||||
| Alone |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 11.5.2003 Где: Dnepropetrovsk, U A Репутация: нет Всего: 6 |
В примере используется АБСТРАКТНЫЙ класс DbProvider. Создается экземпляр его типа вот так: $db = new DbProvider("pgsql"); или так: $db = new DbProvider(); Тебе известны свойства и методы класса DbProvider, а что он внутри себя делает - это НИКОМУ не должно быть известно.
Я не должен об этом объекте ничего знать. Ни как он называется, ни где лежит... -------------------- |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
Alone я несколько не понимаю смысла... Ты делаешь интерфейс базы. Тебе надо всего лишь выбрать базу и все, но сами классы для каждой БД у тебя хранятся в разных файлах, но имеют одинаковое строение.
При чем тут абстракция? |
|||
|
||||
| Alone |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 11.5.2003 Где: Dnepropetrovsk, U A Репутация: нет Всего: 6 |
Возможно с классами для БД получился несколько неудачный пример.
Я не хотел конкретизировать вопрос на БД. Это был частный случай. (как видно не совсем удачный)... Представь себе, что за абстрактным классом скрыта реализация 20 различных классов, наследованных от базового, и при каком условии используется тот или иной класс - тебе неизвестно. Ты общаешься ТОЛЬКО через описанный интерфейс. Вот для такого случая я хотел задать первоначальный вопрос... -------------------- |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
Aloneа смысл?
|
|||
|
||||
| Alone |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 11.5.2003 Где: Dnepropetrovsk, U A Репутация: нет Всего: 6 |
смысл чего?
-------------------- |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
Абстрактных классов. На практике.
|
|||
|
||||
| Alone |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 11.5.2003 Где: Dnepropetrovsk, U A Репутация: нет Всего: 6 |
Э... перечитай плиз мой пост (про пример с скрытой реализ-ей 20 классов) еще раз.
Вроде как понятно изложил... Если непонятно - хрен с ним... закрывай эту тему. -------------------- |
|||
|
||||
| Bikutoru |
|
|||
|
Увлекающийся ![]() ![]() Профиль Группа: Участник Сообщений: 522 Регистрация: 24.5.2005 Где: Москва Репутация: нет Всего: 22 |
Alone, по-моему гораздо лучшебудет, если абстрактный класс не будет знать о своих наследниках, а заботу о создании конкретной реализации абстрактного класса лучше возложить на отдельный клас/метод. Например так:
-------------------- Человек, словно в зеркале мир — многолик, Он ничтожен — и он же безмерно велик! Омар Хайям |
|||
|
||||
| Alone |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 11.5.2003 Где: Dnepropetrovsk, U A Репутация: нет Всего: 6 |
Похоже меня никто не понял...
Я не конкретную задачу решаю, а "обсасываю" механизм.
Я всего лишь хотел спросить, если заменить ЭТО:
на ЭТО:
А все ударились в советы... -------------------- |
||||||
|
|||||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
||||
|
||||
| Alone |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 11.5.2003 Где: Dnepropetrovsk, U A Репутация: нет Всего: 6 |
м... какой на твой взгляд ошибкой? Языка? Синтаксической?
Ни тому ни другому оно не противоречит. Тесты показали полную работоспособность Вот как обстоит дело в рнр5... Может у них кардинально взгляды изменились... -------------------- |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
Alone ну а как ты себе представляешь такую картину.
Ты в текущий объект, в выполняем методе, да и еще в this, который только для внутреннего пользования создаешь новый объект. По логике Access Violation должен быть. Как это работает - диву даюсь. |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 2 Всего: 317 |
Alone паттерн factory предпологает что класс имеет статичный метод, генерящий конкретный instance, например:
В PEAR: DB драйвера наследуються от DB_common, но сути не меняет, можешь свои обьекты наследовать от абстракного MyClass и писать MyClass::Instance('my_sub_type'); Это будет правильно, а не new чего то. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Alone |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 11.5.2003 Где: Dnepropetrovsk, U A Репутация: нет Всего: 6 |
Sardar
Та же "банда четырех" определяет назначение шаблона abstract factory как "предоставление интерфейса для создания семейств связанных между собой или зависимых друг от друга объектов без указания их конкретных классов" Шаблон abstract factory гарантирует что система всегда реализует именно тот набор объектов, который отвечает данной ситуации. Так что таки моя реализация соответствует определению. Да. В твоем пировском примере реализована именно фабрика. Я это место как раз и рассматривал для экспериментов PS: у меня еще с времен ZX-80 осталась "манечка" к минимизации всего. Вот и тут узрел экономию на целый объект Добавлено @ 00:48 Mal Hack
О, вот это уже интереснее... Да. тут с тобой соглашусь... но блин работает... я попробую еще под нагрузкой, чтоб память "поработала", и хотелось бы тесты на рнр5, если у кого есть... -------------------- |
||||
|
|||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 2 Всего: 317 |
Не каждый язык позволит "вернуть" другой обьект (в Java например физически не возможно), также по идее вообще в бесконечный цикл должен твой код убежать. Операция new стоит особнячком от обычной посылки сообщения, это выделение памяти, а конструктор это не просто метод. Для PHP конечно разницы особой нет (кроме памяти, резервируеться место под a и b(что в свою очередь резервирует ещё под своего а)), создаёться хештаблица на подобие той что в массивах юзаеться, далее вызываеться обычный метод, что на время считаеться конструктором. В итоге, лучше так не делай -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Alone |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 11.5.2003 Где: Dnepropetrovsk, U A Репутация: нет Всего: 6 |
убедил. не буду.
Добавлено @ 01:06 кстати, в пире больше подошел бы паттерн адаптер вместо фабрики... IMHO -------------------- |
|||
|
||||
| IZ@TOP |
|
|||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 1 Всего: 73 |
$this = чего-то; вызовет фатальную ошибку, по словам интерпретатора "Нельзя переназначить внутренний указатель объекта". -------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Для профи | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |