![]() |
|
Модераторы: 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, я только начал разбираться, а ты нехороший человек добавил мне ещё "каши"
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
![]()
|
| Правила форума "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. |