![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 10 Всего: 71 |
читаю, читаю разные статьи, много примеров, но никак не могу понять необходимость использования абстрактных классов. Вот разбираю две CMS у которых был общий предок когда-то. Одна имеет просто классы, другая использует везде абстрактные классы..
Так в чём преимущества? На сколько это вообще помогает в работе? Помогите понять ;) Никогда этим не пользовался, но хочется научится или хотя бы понять... ps конечно всё применительно с PHP5.3+ -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| MoLeX |
|
|||
![]() Местный пингвин ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4076 Регистрация: 17.5.2007 Репутация: 46 Всего: 140 |
-------------------- Amazing |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 10 Всего: 71 |
в том то и дело что видел это и пытался понять, но никак не могу понять зачем такие сложности.. Не хватает понимая какой-то маленькой вещи... и головоломка сложится
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Gold Dragon, Это такая-же, по сути, дисциплинарная фенечка как и implements. Только контроль не на стадии компиляции, а в run-time. Впрочем, для PHP разница не сильно принципиальна. Все абстрактные методы обязаны быть перекрыты, иначе случится карачун. Примеров разумного применения этих фенечек довольно много в документации и просто в ООП примерах.
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 10 Всего: 71 |
просто мне все примеры кажутся очень сложными, т.е. очень много кода, а по сути можно (мне так кажется) сделать и пару строчками. Вот я и не могу уловить суть.. Мне сейчас это представляется как на самолёте перевозить 1 килограмм груза на расстояние 1 километр...
Толи примеры слишком буквальные и я не вижу всей глубины -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 20 Всего: 42 |
Не совсем. В отличии от интерфейсов абстрактные классы могут нести реализацию общих методов. -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
| Aliance |
|
||||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 14 Всего: 137 |
Вообще абстракцию нужно рассматривать в совокупности с другими важнейшими понятиями в ООП - инкапсуляция и полиморфизм.
Например, если у тебя есть два класса диван и стул, оба имеют методы сидеть, но диван еще имеет и метод лежать. Можно написать вот так:
Но при таком подходе представь что будет если нужно будет внести изменения в метод сидеть? Придется его изменять в двух местах. А если таких классов больше двух? Логичнее написать что-то вроде
Выигрыш - меньше кода, меньше зависимостей, легко редактировать, более гибкая структура. Добавлено через 1 минуту и 11 секунд Хм, наверное я больше привел пример из понятия "наследование", но в общем-то интерфейсы и абстрактные классы помогают организовывать работу этого самого наследования. |
||||
|
|||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 10 Всего: 71 |
уже где-то на грани полного понимания, но тут же опять я понимаю простое наследование класса.. И что если "сидеть" разные, например, "сидеть на.." и "сидеть за..."?
Добавлено через 2 минуты и 17 секунд ps
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| Sentox |
|
||||
|
как то так ![]() ![]() Профиль Группа: Участник Сообщений: 392 Регистрация: 27.1.2009 Где: Зимбабве Репутация: 7 Всего: 7 |
Слово абстракция уже само по себе относится больше к проектированию нежели программированию.
Абстракция, выше указанного примера "Мебель", физически не существует как бы, а является категорией объектов, включающей какие то общие свойства, действия .... выражающихся соответственно в свойствах класса, методах. Что даёт абстрактный класс: 1. Реализация обще-функциональных действий (методов) (в сравнении с интерфейсами); 2. Ещё важнее, здесь стоит понять, общие интерфейсы. Как их реализация, так и только их декларация (то есть дочерние объекты будут иметь общий контракт для клиентов, что это даёт смотрим ниже) 3. Абстрактный класс не инстанцируется, что само по себе говорит что он задаёт тип и только задаёт тип, который "стандартизирует" какой то набор интерфейсов (опять же "контракт") 4. В абстрактных классах можно задавать и общие свойства, интерфейсы этого не имеют. А теперь из примера Aliance, использование покажет как абстрактный класс поможет в части "безопасного программирования":
В типизированных языках это лучше видно в декларации возвращаемых типах. В PHP же нужно проверить для того что бы быть уверенным что есть такой интерфейс или свойство у класса. Добавлено через 6 минут и 49 секунд Gold Dragon,
В обычном классе если сказал "А" (создал метод) то и скажи "Б" (реализовать его). В абстрактном можно только задекларировать метод, указывая тем что дочернии будут обязаны его реализовать, и тем самым задаёт контракт интерфейсов, не реализовывая их. Это сообщение отредактировал(а) Sentox - 14.5.2012, 21:11 |
||||
|
|||||
| MoLeX |
|
|||
![]() Местный пингвин ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4076 Регистрация: 17.5.2007 Репутация: 46 Всего: 140 |
на мой взгляд абстрактный класс == трейтам
-------------------- Amazing |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 10 Всего: 71 |
Вот наверное это для меня более-менее объяснило для чего это нужно... Но опять же, это больше проектирование самой системы, т.е. грубо говоря создание "скелета" PS ?? -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| MoLeX |
|
|||
![]() Местный пингвин ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4076 Регистрация: 17.5.2007 Репутация: 46 Всего: 140 |
Gold Dragon, это из PHP 5.4 - trait
-------------------- Amazing |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Не самая тривиальная мысль -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| MoLeX |
|
|||
![]() Местный пингвин ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4076 Регистрация: 17.5.2007 Репутация: 46 Всего: 140 |
ksnk, ==, а не ===
Это сообщение отредактировал(а) MoLeX - 15.5.2012, 08:44 -------------------- Amazing |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 10 Всего: 71 |
MoLeX, я только начал разбираться, а ты нехороший человек добавил мне ещё "каши"
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| Sentox |
|
||||
|
как то так ![]() ![]() Профиль Группа: Участник Сообщений: 392 Регистрация: 27.1.2009 Где: Зимбабве Репутация: 7 Всего: 7 |
Мне кажется это больше попытка использовать множественное наследование, то есть: extends Class1, Class2 == trait (use) Да, так и есть это своего рода множественное наследование действий Добавлено @ 09:16
Правильно, скелет задаёт инфраструктуру. Что это даёт: 1. Стандартизацию лучший приём программирования, то есть паттерны. При достаточной квалификации разработчик может легко включаться в процесс работы, зная шаблоны проектирования. Почему это включил в тему абстрактных классов, так как они являются основным контрактом интерфейсом и связующим звеном в инфраструктуре, и в большинстве случаев проверяется объект на этот тип, а не тип реализующего класса. 2. Опять же "безопасное программирование", что само по себе уже является большим благом 3. Чистый код и переиспользуемость дублирующихся участков кода (это если сравнивать с интерфейсами(implements)) Да и ещё, наверное самое главное Это сообщение отредактировал(а) Sentox - 15.5.2012, 09:34 |
||||
|
|||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
К множественному наследованию это не имеет прямого отношения. Это протез множественного наследования Если бы traits'ы были обычными классами, с наследованием и блекждеком - это было бы нормальным множественным наследованием. А так - трейты - это просто заготовки, которые вставляют в описание класса общие для пучка объектов методы. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 26 Всего: 101 |
Gold Dragon, кратко - абстрактный класс это такой, который может только выступать в качестве базового, создать объект такого типа нельзя. Не бывает просто птиц и самолетов, в программе должен быть конкретный зяблик и ту134. однако все птицы (и самолеты) имеют нечто общее, что нужно
1. задекларировать. если этого достаточно, то нам подходит интерфейс 2. реализовать. т.е. есть некоторое общее поведение, реализация. здесь нужен абстрактный класс. понятия абстрактного класса и метода нужны для уточнения семантики, что бы программист 1. видя описание понимал установленные в данной иерархии наследования правила 2. получил ошибку (времени компиляции, времени исполнения) в случае неправильного использования. трейт отношения к абстрактным классам не имеет. трейт вообще не самостоятельный кусок, он может быть использован только в контексте конкретного (базового) класса. Добавлено через 6 минут и 21 секунду имхо полезно поизучать в целом объектно-ориентированные и аспектно-ориентированные анализ и проектирование, т.к. конкретные языки обычно реализуют только отдельные аспекты, и каждый по-своему |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 10 Всего: 71 |
Ну более менее стало понятно. Единственное - пока не понимаю необходимость применения этого в том или ином случае. Если брать к примеру CMS, то это достаточно большие проекты. Но изучая и анализируя их я понимаю что существует практически два разных подхода...
PS
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 14 Всего: 137 |
В голову пришел более уместный пример. Скажем фреймворк ZF изобилирует абстрактными классами. Почему? потому что он разделяет стремление многих разработчиков к расширению, помогая им в оном. Например, возьмем работы с БД. В ZF есть абстрактная фабрика, которая не определяет, а лишь говорит какие методы должны включать в себя фабрики любого драйвера БД для правильной и совместимой работы (тот же CRUD). То есть абстрактный класс пишут разработчики продукта, для легкого расширения функционала разработчиками-пользователями. |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 10 Всего: 71 |
Грубо говоря: Абстрактный - это задумка философа-проектировщика, который задаёт правила. Всё остальное наследуется от него, что и делают уже программеры. Так?
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| Sentox |
|
|||
|
как то так ![]() ![]() Профиль Группа: Участник Сообщений: 392 Регистрация: 27.1.2009 Где: Зимбабве Репутация: 7 Всего: 7 |
Да, только абстрактный класс позволяет ещё архитектору задавать начальную функциональность и состояние, в отличии от самого Interface. Как это да же в голову не пришло Это сообщение отредактировал(а) Sentox - 15.5.2012, 12:19 |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 26 Всего: 101 |
форум место обмена опытом и общения, но на университет не потянет. книжки надо. если бы тема была создана в разделе философии программирования, а не конкретного языка, ответ возможно был бы другим |
|||
|
||||
| baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 26 Всего: 101 |
это как совет маститого писателя начинающему: если можешь не писать, не пиши. строгих правил нет, это надо прочувствовать, необходимость сама придет. есть ООП методология, но она слишком объемна, что бы её здесь описывать. хотя сводится она к простому - объектно-ориентированной декомпозиции: сначала в задаче выделяются объекты и способы их взаимодействия, потом они обобщаются в классы, полученные классы снова обобщаются, и так пока будет нечего обобщать. если какие-то из полученных классов являются абстрактными типа птиц и самолетов, их следует сделать абстрактными. сильный признак абстрактного класса - наличие абстрактного (без реализации) виртуального метода. так, в системе графических объектов базовый класс Shape является абстрактным, т.к. содержит метод draw() который можо реализовать только в конкретных подклассах. для php есть такой пример: допустим нам требуется работа с деревьями, а именно - обход дерева в глубину. задача часто возникает при создании меню, при обработке иерархических данных в бд. если полностью абстрагироваться от представления данных и конкретных решаемых задач, получим такой класс:
сам класс бесполезен, его обязательно нужно конкретизировать для конкретного представления (get_data, get_children) и конкретной задачи (node_begin, node_end). при этом класс реализует обход дерева - walk_tree(), которую уже не нужно изменять Это сообщение отредактировал(а) baldina - 15.5.2012, 14:52 |
||||
|
|||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 10 Всего: 71 |
ну в принципе всё понял и разобрался... По ходу изучения ещё и в интерфейсы залез..
Вот именно для такого случая абстрактный класс будет подходить практически идеально.. baldina, ты прав, это само придёт.. и даже пришло зы
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |