Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Абстрактный класс. Помогите понять 
:(
    Опции темы
Gold Dragon
Дата 14.5.2012, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



читаю, читаю разные статьи, много примеров, но никак не могу понять необходимость использования абстрактных классов. Вот разбираю две CMS у которых был общий предок когда-то. Одна имеет просто классы, другая использует везде абстрактные классы..

Так в чём преимущества? На сколько это вообще помогает в работе? Помогите понять ;) Никогда этим не пользовался, но хочется научится или хотя бы понять...

ps
конечно всё применительно с PHP5.3+


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
MoLeX
Дата 14.5.2012, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140





--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 14.5.2012, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



в том то и дело что видел это и пытался понять, но никак не могу понять зачем такие сложности.. Не хватает понимая какой-то маленькой вещи... и головоломка сложится 


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 14.5.2012, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Gold Dragon, Это такая-же, по сути, дисциплинарная фенечка как и implements. Только контроль не на стадии компиляции, а в run-time. Впрочем, для PHP разница не сильно принципиальна. Все абстрактные методы обязаны быть перекрыты,  иначе случится карачун. Примеров разумного применения этих фенечек довольно много в документации и просто в ООП примерах.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 14.5.2012, 15:33 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



просто мне все примеры кажутся очень сложными, т.е. очень много кода, а по сути можно (мне так кажется) сделать и пару строчками. Вот я и не могу уловить суть.. Мне сейчас это представляется как на самолёте перевозить 1 килограмм груза на расстояние 1 километр... smile

Толи примеры слишком буквальные и я не вижу всей глубины


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Fortop
Дата 14.5.2012, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(ksnk @  14.5.2012,  15:20 Найти цитируемый пост)
Это такая-же, по сути, дисциплинарная фенечка

Не совсем.
В отличии от интерфейсов абстрактные классы могут нести реализацию общих методов.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Aliance
Дата 14.5.2012, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Вообще абстракцию нужно рассматривать в совокупности с другими важнейшими понятиями в ООП - инкапсуляция и полиморфизм.

Например, если у тебя есть два класса диван и стул, оба имеют методы сидеть, но диван еще имеет и метод лежать. Можно написать вот так:
Код

class Диван {
    function сидеть() {
        //
    }
    function лежать() {
        //
    }
}

class Стул {
    function сидеть() {
        //
    }
}

Но при таком подходе представь что будет если нужно будет внести изменения в метод сидеть? Придется его изменять в двух местах. А если таких классов больше двух?  smile 

Логичнее написать что-то вроде
Код

abstract class Мебель {
    function сидеть() {
        //
    }
}

class Диван extends Мебель {
    function сидеть() {
        parent::сидеть();
    }
    function лежать() {
        //
    }
}

class Стул extends Мебель {
    function сидеть() {
        parent::сидеть();
    }
}


Выигрыш - меньше кода, меньше зависимостей, легко редактировать, более гибкая структура.

Добавлено через 1 минуту и 11 секунд
Хм, наверное я больше привел пример из понятия "наследование", но в общем-то интерфейсы и абстрактные классы помогают организовывать работу этого самого наследования.
PM MAIL WWW ICQ Skype   Вверх
Gold Dragon
Дата 14.5.2012, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



уже где-то на грани полного понимания, но тут же опять я понимаю простое наследование класса.. И что если "сидеть" разные, например, "сидеть на.." и "сидеть за..."?

Добавлено через 2 минуты и 17 секунд
ps
Цитата

Хм, наверное я больше привел пример из понятия "наследование",
вот и я пока не осознаю чем абстракция "полезнее"


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Sentox
Дата 14.5.2012, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



Слово абстракция уже само по себе относится больше к проектированию нежели программированию.
Абстракция, выше указанного примера "Мебель", физически не существует как бы, а является категорией объектов, включающей какие то общие свойства, действия .... выражающихся соответственно в свойствах класса, методах.

Что даёт абстрактный класс:
1. Реализация обще-функциональных действий (методов) (в сравнении с интерфейсами);
2. Ещё важнее, здесь стоит понять, общие интерфейсы. Как их реализация, так и только их декларация (то есть дочерние объекты будут иметь общий контракт для клиентов, что это даёт смотрим ниже)
3. Абстрактный класс не инстанцируется, что само по себе говорит что он задаёт тип и только задаёт тип, который "стандартизирует" какой то набор интерфейсов (опять же "контракт") 
4. В абстрактных классах можно задавать и общие свойства, интерфейсы этого не имеют.

А теперь из примера  Aliance, использование покажет как абстрактный класс поможет в части "безопасного программирования":
Код

$Диван = new Диван();
// Здесь проверяем контракт объекта, то есть "стандарт" группы интерфейсов, который является типом "Мебель" но не "Диван"
if(!($Диван instanceof Мебель ))
     throw new Exception('Караул!!! В этом объекте может не быть действия `сидеть`!');

$Диван->сидеть(); 


В типизированных языках это лучше видно в декларации возвращаемых типах. В PHP же нужно проверить для того что бы быть уверенным что есть такой интерфейс или свойство у класса.

Добавлено через 6 минут и 49 секунд
Gold Dragon, 
Цитата

вот и я пока не осознаю чем абстракция "полезнее" 


В обычном классе если сказал "А" (создал метод) то и скажи "Б" (реализовать его).
В абстрактном можно только задекларировать метод, указывая тем что дочернии будут обязаны его реализовать, и тем самым задаёт контракт интерфейсов, не реализовывая их.

Это сообщение отредактировал(а) Sentox - 14.5.2012, 21:11
PM MAIL   Вверх
MoLeX
Дата 15.5.2012, 05:36 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



на мой взгляд абстрактный класс == трейтам 


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 15.5.2012, 07:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Цитата(Sentox @  14.5.2012,  22:08 Найти цитируемый пост)
Слово абстракция уже само по себе относится больше к проектированию нежели программированию.
Вот именно это меня и смущает, именно по этому и не могу осознать целесообразность.

Цитата(Sentox @  14.5.2012,  22:08 Найти цитируемый пост)
В абстрактном можно только задекларировать метод, указывая тем что дочернии будут обязаны его реализовать, и тем самым задаёт контракт интерфейсов, не реализовывая их.
Вот наверное это для меня более-менее объяснило для чего это нужно... Но опять же, это больше проектирование самой системы, т.е. грубо говоря создание "скелета"


PS
Цитата(MoLeX @  15.5.2012,  06:36 Найти цитируемый пост)
трейтам  
??


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
MoLeX
Дата 15.5.2012, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



Gold Dragon, это из PHP 5.4 - trait


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
ksnk
Дата 15.5.2012, 08:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(MoLeX @  15.5.2012,  05:36 Найти цитируемый пост)
абстрактный класс == трейт

Не самая тривиальная мысль  smile Нельзя ли пояснить, чем "инкулуд внутри описания класса" похож на абстрактные методы?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
MoLeX
Дата 15.5.2012, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



ksnk, ==, а не ===  smile 

Это сообщение отредактировал(а) MoLeX - 15.5.2012, 08:44


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 15.5.2012, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



MoLeX, я только начал разбираться, а ты нехороший человек добавил мне ещё "каши" smile


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1017 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.