За последние 24 часа нас посетили 24469 программистов и 1656 роботов. Сейчас ищут 880 программистов ...

ООП: интерфейсы и абстрактные классы.

Тема в разделе "PHP для новичков", создана пользователем WildZero, 14 апр 2011.

  1. WildZero

    WildZero Активный пользователь

    С нами с:
    24 фев 2010
    Сообщения:
    242
    Симпатии:
    0
    Адрес:
    Пермь
    Сколько не читал об интрефейсах и об абстрактных классах, так и не смогу понять для чего они используются.. Может вы сможете объяснить доступным языком?
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Нельзя создать экземпляр абстрактного класса
    PHP:
    1. <?php
    2. abstract class Client {
    3. }
    4.  
    5. $c = new Client; // Fatal Error
    я сейчас пишу систему, в ней есть два класса клиентов Sender и Recipient. Но у них должно быть несколько одинаковых методов. эти методы наследуются от класса Client
    PHP:
    1. <?php
    2. class Sender extends Client {
    3. }
    4. class Recipient extends Client {
    5. }
    таким образом, создавать экземпляр класса Client смысла нет - есть смысл только в Sender b Recipient. Чтобы его невозможно было создать, класс Client объявлен абстрактным. Благодаря этому, другому программист, или мне через год сразу станет ясным назначение класса Client.
     
  3. WildZero

    WildZero Активный пользователь

    С нами с:
    24 фев 2010
    Сообщения:
    242
    Симпатии:
    0
    Адрес:
    Пермь
    Т.е. абстрактный класс, показывает "структуру" наследуемых классов?
     
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    WildZero
    В абстрактном классе могуть быть абстрактные методы
    PHP:
    1. <?php
    2. abstract public function fn();
    они не содержат код и просто описывают структуру.
    Но могут быть и не абстрактные методы, т.е. нормальные функции, и они будут работать в наследниках.
     
  5. WildZero

    WildZero Активный пользователь

    С нами с:
    24 фев 2010
    Сообщения:
    242
    Симпатии:
    0
    Адрес:
    Пермь
    С абстрактными классами более менее понятно. А интерфейсы? В них вообще не смог врубиться...
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Разберись вот с этим: http://ru2.php.net/ArrayAccess
    Если класс реализует интерфейс ArrayAccess, PHP разрешает обращаться к нему, как к массиву
    PHP:
    1. $obj['k'] = 'v';
    2.  
    наследовать можно только один класс
    PHP:
    1. <?php
    2. class Player extends User
    интерфейсов можно имплементировать сколько угодно
    PHP:
    1.  
    2. <?php
    3. class Player extends User implements Human, Male, ArrayAccess
    потом проверять
    PHP:
    1. <?php
    2. if ($obj instanceof Male)
    интерфейсы просто описывают. Если ты имплементируешь ArrayAccess, но забыл объявить метод offsetSet, получишь фатальную ошибку.
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    WildZero
    Сколько ни читал
    иначе получится, что ты вообще ничего не читал =)

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

    WildZero Активный пользователь

    С нами с:
    24 фев 2010
    Сообщения:
    242
    Симпатии:
    0
    Адрес:
    Пермь
    Так и знал что здесь ошибка.
    До этого мне ещё далеко
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    WildZero
    не используется, если ты хочешь что-то отрицать.

    "сколько ни искать - не найдешь" - типичный пример =)

    WildZero
    До этого мне ещё далеко
    да я не к тому. просто не понятно, зачем так сделали, ибо явственно понятно, что сделали специально. Тогда бы можно было бы наследовать, но нельзя было бы вызывать методы, и прототип не сохранял бы значения переменных внутри себя. Т.е. статики в пхп могут использоваться для прототипирования, но являются вполне зрелой самостоятельной личностью.
     
  10. Greg1978

    Greg1978 Активный пользователь

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    Всем говорю, и сейчас скажу, учи проектировочную часть а не с бухты барахты создавать классы. Зная назначение классов можно будет не задавать вопросов по поводу интерфейсов и абстрагирования.
    В помощь С. Макконнелл ("Совершенный код") - масса вопросов отпадёт.
    igordata
    Полиморфизм классов это и есть типичный пример
    Да, кстати, YII фреймворк посмотри там хорошо применены интерфейсы.