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

Поиск:

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


как то так
**


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

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



Цитата(MoLeX @ 15.5.2012,  07:37)
Gold Dragon, это из PHP 5.4 - trait

Мне кажется это больше попытка использовать множественное наследование, то есть:
extends Class1, Class2 == trait (use)

Да, так и есть это своего рода множественное наследование действий smile

Добавлено @ 09:16
Цитата(Gold Dragon @ 15.5.2012,  07:25)
Но опять же, это больше проектирование самой системы, т.е. грубо говоря создание "скелета"

Правильно, скелет задаёт инфраструктуру. Что это даёт:
1. Стандартизацию лучший приём программирования, то есть паттерны. При достаточной квалификации разработчик может легко включаться в процесс работы, зная шаблоны проектирования. Почему это включил в тему абстрактных классов, так как они являются основным контрактом интерфейсом и связующим звеном в инфраструктуре, и в большинстве случаев проверяется объект на этот тип, а не тип реализующего класса.
2. Опять же "безопасное программирование", что само по себе уже является большим благом smile
3. Чистый код и переиспользуемость дублирующихся участков кода (это если сравнивать с интерфейсами(implements))

Да и ещё, наверное самое главное smile, если мы задекларируем метод но не реализуем, при инстанцировании его (если допустим сделать такую возможность), клиент вызовет метод не реализованный в нём: вопрос, что произойдёт? Да, логичнее его закрыть как абстрактный (механизм запрета создания объекта, если хотите) и не давать инстанцировать, так как противоречит логическому применению экземпляра класса, в случае вызова не реализованного метода. 

Это сообщение отредактировал(а) Sentox - 15.5.2012, 09:34
PM MAIL   Вверх
ksnk
Дата 15.5.2012, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Sentox @  15.5.2012,  09:09 Найти цитируемый пост)
так и есть это своего рода множественное наследование действий

К множественному наследованию это не имеет прямого отношения. Это протез множественного наследования  smile Впрочем даже в качестве протеза это может быть удобно...

Если бы traits'ы были обычными классами, с наследованием и блекждеком - это было бы нормальным множественным наследованием. А так - трейты - это просто заготовки, которые вставляют в описание класса общие для пучка объектов методы. 


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


Эксперт
****


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

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



Gold Dragon, кратко - абстрактный класс это такой, который может только выступать в качестве базового, создать объект такого типа нельзя. Не бывает просто птиц и самолетов, в программе должен быть конкретный зяблик и ту134. однако все птицы (и самолеты) имеют нечто общее, что нужно
1. задекларировать. если этого достаточно, то нам подходит интерфейс
2. реализовать. т.е. есть некоторое общее поведение, реализация. здесь нужен абстрактный класс.

понятия абстрактного класса и метода нужны для уточнения семантики, что бы программист
1. видя описание понимал установленные в данной иерархии наследования правила
2. получил ошибку (времени компиляции, времени исполнения) в случае неправильного использования.

трейт отношения к абстрактным классам не имеет. трейт вообще не самостоятельный кусок, он может быть использован только в контексте конкретного (базового) класса.

Добавлено через 6 минут и 21 секунду
имхо полезно поизучать в целом объектно-ориентированные и аспектно-ориентированные анализ и проектирование, т.к. конкретные языки обычно реализуют только отдельные аспекты, и каждый по-своему
PM MAIL   Вверх
Gold Dragon
Дата 15.5.2012, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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



PS

Цитата(baldina @  15.5.2012,  11:00 Найти цитируемый пост)
имхо полезно поизучать в целом объектно-ориентированные и аспектно-ориентированные анализ и проектирование,
самый бесполезный совет  smile Без обид, но что я сейчас делаю?  smile 



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


I ♥ <script>
****


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

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



Цитата(Gold Dragon @  14.5.2012,  21:39 Найти цитируемый пост)
вот и я пока не осознаю чем абстракция "полезнее" 

В голову пришел более уместный пример. Скажем фреймворк ZF изобилирует абстрактными классами. Почему? потому что он разделяет стремление многих разработчиков к расширению, помогая им в оном. Например, возьмем работы с БД. В ZF есть абстрактная фабрика, которая не определяет, а лишь говорит какие методы должны включать в себя фабрики любого драйвера БД для правильной и совместимой работы (тот же CRUD).

То есть абстрактный класс пишут разработчики продукта, для легкого расширения функционала разработчиками-пользователями.
PM MAIL WWW ICQ Skype   Вверх
Gold Dragon
Дата 15.5.2012, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Грубо говоря: Абстрактный - это задумка философа-проектировщика, который задаёт правила. Всё остальное наследуется от него, что и делают уже программеры. Так?


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


как то так
**


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

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



Цитата(Gold Dragon @ 15.5.2012,  11:31)
Грубо говоря: Абстрактный - это задумка философа-проектировщика, который задаёт правила. Всё остальное наследуется от него, что и делают уже программеры. Так?

Да, только абстрактный класс позволяет ещё архитектору задавать начальную функциональность и состояние, в отличии от самого Interface.

Как это да же в голову не пришло smile. Наглядный пример SPL

Это сообщение отредактировал(а) Sentox - 15.5.2012, 12:19
PM MAIL   Вверх
baldina
Дата 15.5.2012, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Gold Dragon @  15.5.2012,  10:47 Найти цитируемый пост)
Цитата(baldina @  15.5.2012,  11:00 )
имхо полезно поизучать в целом объектно-ориентированные и аспектно-ориентированные анализ и проектирование,
самый бесполезный совет   Без обид, но что я сейчас делаю?   

форум место обмена опытом и общения, но на университет не потянет. книжки надо.
если бы тема была создана в разделе философии программирования, а не конкретного языка, ответ возможно был бы другим smile
PM MAIL   Вверх
baldina
Дата 15.5.2012, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Gold Dragon @  15.5.2012,  10:47 Найти цитируемый пост)
Единственное - пока не понимаю необходимость применения этого в том или ином случае.

это как совет маститого писателя начинающему: если можешь не писать, не пиши.
строгих правил нет, это надо прочувствовать, необходимость сама придет.
есть ООП методология, но она слишком объемна, что бы её здесь описывать. хотя сводится она к простому - объектно-ориентированной декомпозиции: сначала в задаче выделяются объекты и способы их взаимодействия, потом они обобщаются в классы, полученные классы снова обобщаются, и так пока будет нечего обобщать. если какие-то из полученных классов являются абстрактными типа птиц и самолетов, их следует сделать абстрактными. сильный признак абстрактного класса - наличие абстрактного (без реализации) виртуального метода.
так, в системе графических объектов базовый класс Shape является абстрактным, т.к. содержит метод draw() который можо реализовать только в конкретных подклассах.

для php есть такой пример: допустим нам требуется работа с деревьями, а именно - обход дерева в глубину. задача часто возникает при создании меню, при обработке иерархических данных в бд.
если полностью абстрагироваться от представления данных и конкретных решаемых задач, получим такой класс:
Код

abstract class Tree {
  abstract protected function get_data ($node);
  abstract protected function get_children ($node);
           protected function node_begin ($node_data) { /* empty, can be overriden */ }
           protected function node_end ($node_data)   { /* empty, can be overriden */ }

  protected function has_children ($root) {
    return count($this->get_children ($root)) > 0;
  }

  protected function walk_tree ($root)
  {
    $data = $this->get_data($root);
    $this->node_begin ($data);
    if ($this->has_children ($root))
      foreach ($this->get_children ($root) as $node)
        $this->walk_tree ($node);
    $this->node_end ($data);
  }
}; // class Tree

сам класс бесполезен, его обязательно нужно конкретизировать для конкретного представления (get_data, get_children) и конкретной задачи (node_begin,  node_end). при этом класс реализует обход дерева - walk_tree(), которую уже не нужно изменять

Это сообщение отредактировал(а) baldina - 15.5.2012, 14:52
PM MAIL   Вверх
Gold Dragon
Дата 15.5.2012, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



ну в принципе всё понял и разобрался... По ходу изучения ещё и в интерфейсы залез.. smile На данном этапе пока нахожу для себя их реальное применение только в плагинах (расширениях) к проекту, например к той же CMS (ну или к какому-либо компоненту).

Вот именно для такого случая абстрактный класс будет подходить практически идеально.. 

baldina, ты прав, это само придёт.. и даже пришло smile

зы
Цитата(baldina @  15.5.2012,  15:33 Найти цитируемый пост)
форум место обмена опытом и общения, но на университет не потянет. книжки надо.
В данном случае наоборот: книжки прошёл и "теоретический университет", а вот практики (опыта работы) нет... smile Но и нужен форум как идеальное место для общения и обменом опытом.. Да и народ хоть мозги разомнёт, не только  кодить, но и немного пофилософствовать иногда нужно  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.0822 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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