Урок 10. Курс по ООП PHP. Абстрактные классы и интерфейсы


Содержание материала:

Интерфейсы и абстрактные классы в PHP

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

Ключевое отличия:

  • интерфейс не может реализовывать логику приложения, он только описывает структуру класса
  • интерфейсов можно реализовывать столько, сколько нужно; класс может наследоваться только от одного класса
  • абстрактный класс невозможно инициализировать
  • абстрактный класс может содержать реализацию методов

Абстрактные классы и интерфейсы

1. Предполагаемая аудитория

Эта статья предназначена для опытных PHP-программистов, которые хотят разобраться в том, как работать с типами классов в PHP 5 через приведение типов , абстрактные классы и интерфейсы. Предполагается, что читатели уже знакомы с объектно-ориентированным программированием, включая устройство самих классов и механизм наследования.

2. Введение

Большинство PHP-программистов знают, что поддержка объектно-ориентированного программирования в Zend Engine II значительно улучшена. Три новые возможности — приведение типов, абстрактные классы и интерфейсы определяют возможности установки и проверки типов классов. В этой статье мы увидим, как эти возможности помогают писать более качественный код и предотвращать появление ошибок.

3. Типы классов

В PHP существует 12 предопределенных типов данных, включая простые типы, например, целые и с плавающей точкой, комплексные типы (массивы и объекты) и специальные типы (ресурсы и NULL). Поскольку PHP поддерживает классы и объекты, у вас также есть возможность определять собственные типы. На самом деле, каждый раз при создании класса вы определяете новый тип данных.

Вот простой класс:

Создав класс Question, вы также автоматически определили и тип данных Question. Объект класса Question принадлежит типу данных Question, так же, как и объекты классов, пронаследованных от класса Question.

Вот класс, наследующий Question:

У объекта $question комплексная принадлежность. Он принадлежит к типу ResourceQuestion, но в то же время он принадлежит и к типу Question, так как класс ResourceQuestion пронаследован от класса Question.

4. Почему важны типы классов?

Если вы знаете тип объекта, вы знаете его характеристики и возможности. Если вы скажете мне, что объект $question принадлежит типу Question, я сразу пойму, что у него есть метод answer(), который я могу вызвать. А если вы мне скажете, что $question также является объектом класса ResourceQuestion, вы также дадите мне понять, что у объекта есть и метод answer(), и метод setResourceURL(). Вооружившись этой информацией об объекте $question, я смогу нормально работать с ним.

5. Проверяем и задаем типы

В PHP 5 появился новый оператор instanceof, при помощи которого можно проверить тип объекта. Оператор instanceof принимает два параметра. Первый — это тестируемый объект, второй — тип, на принадлежность к которому проверяется объект. Соответственно, для того, чтобы проверить, что объект $question принадлежит типу Question, используется следующий синтаксис:

Скорее всего, для вашим методам и функциям не безразличны типы передаваемых им классов и аргументов. Вы уверены, что другие программисты при работе с вашими классами всегда будут передавать им корректные параметры? И как эти неправильные параметры могут повлиять на работу ваших скриптов?

Давайте расширим класс Question. Это часть сильно упрощенной библиотеки «Викторина». Каждому объекту Question необходим объект Marker, отвечающий за проверку ответа пользователя на вопрос. В этом примере класс Question принимает объект Marker как аргумент конструктора.

За код, вызывающий __construct(), может отвечать другой программист, поэтому представим, что произойдет если в конструктор будет передан неправильный тип объекта? Правильный ответ — «ничего», и в этом-то и заключается проблема. Мы просто сохраним объект Marker в атрибут, готовый к дальнейшему использованию в методе answer(). Еси в конструктор был передан объект не того типа, мы не узнаем этого до тех пор, пока не вызовем метод answer():

Это именно та ситуация, в которой проверка типов может предотвратить возникновение проблем в дальнейшем. Если мы не хотим, чтобы в наш класс пробрались данные неправильного типа, и затаились, ожидая подходящей возможности доставить нам побольше неприятностей, мы должны вручную проверять тип аргумента $marker:

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

В PHP 5 эта проблема решена за счёт строгой типизации классов. Просто написав перед аргументом название типа, вы укажете, что PHP должен следить, чтобы переданные данные были указанного типа:

Написав ‘Marker’ перед переменной $marker, мы жестко задали ее тип. Это значит, что передача в объект любого другого типа, кроме типа Marker вызовет следующую ошибку:

Fatal error: Argument 2 must be an object of class Marker in…

Теперь, когда вызывают наш метод answer(), мы можем быть уверены, что атрибут Question::$marker содержит объект типа Marker (тем не менее, мы все равно должны проверять, что его значение не NULL.)

6. Работаем с типами классов: абстрактные классы

Вы уже видели, как пользовательские типы данных гарантируют правильные интерфейсы. На самом деле, можно пойти еще дальше и отделить интерфейс от его реализации.

Вот реализации классов Question и Marker:

В этом примере мы расширили класс Question, и теперь он поддерживает счетчик, равный единице или нулю. Класс Marker хранит правильный ответ. Когда он вызывается в классе Question, он попросту сравнивает строку из $condition с переданным методу mark() ответом пользователя. Если строки совпадают, метод возвращает true. Вот небольшой пример, проверяющий работу этих классов:

Для отражения взаимоотношений между классами можно использовать диаграммы. Чаще всего для этого используют Unified Modeling Language (UML). На этой диаграмме показаны взаимоотношения между классами Question и Marker.

Пока что логика оценок ответов в классе Marker сыровата. Что произойдет, если требования станут более сложными? Администратор викторин вероятнее всего потребует большей гибкости в создании критериев оценки. Возможно, ей понадобится создавать вопросы типа: «Назовите ключевые слова контроля доступа», при этом пользователь должен указать их все через запятую.

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

В классе Marker используются две константы: Marker::MATCH и Marker::CLIST, чтобы отслеживать способ оценки ответов, для которой вызван класс. Если свойство Marker::$type содержит значение, определенное в Marker::MATCH, то метод Marker::mark() сравнивает строки. Если Marker::$type содержит значение, определенное в Marker::CLIST, то объект разбивает строку ответа на части и сравнивает каждую из них.

Мы устанавливаем значение для флага Marker::$type в конструкторе. Аргумент $type в определении метода конструктора задает значение по умолчанию, которое может быть изменено пользователем.

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

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

Абстрактный класс создается с помощью добавления ключевого слова abstract к обычному объявлению класса.

После того, как вы так сделаете, станет невозможно создавать объекты этого класса. Абстрактные классы предназначены для того, чтобы создавать их подклассы. Абстрактные классы могут иметь как обычные атрибуты и методы, так и абстрактные методы. При объявлении абстрактного метода ключевое слово abstract должно стоять на первом месте. Абстрактные классы не должны содержать реализации метода — они только описывают интерфейс метода.

Этот код изменяет класс Marker, делая его абстрактным:

В этом коде используется ключевое слово abstract для модификации как класса Marker, так и его методов handleCondition() и mark(). Конструктор сохраняет необработанную строку с условием (переданную через аргумент $condition_s) в атрибут, а потом вызывает абстрактный метод handleCondition(), оставляя детали дальнейшей ее обработки дочерним классам.

Любой дочерний класс абстрактного суперкласса должен включать в себя реализацию всех абстрактных методов родителя или сам должен быть абстрактным. Если вы этого не сделаете, PHP выдаст ошибку:

При реализации абстрактных методов, вы должны определить такое же количество аргументов, указывая тип аргументов, везде, где он был указан в определении абстрактного метода. Вы должны также убедиться, что уровень доступа к методу (public, protected или private) не жестче, чем объявленный в абстрактном предке. Проще говоря, объявление вашего метода должно полностью совпадать с объявлением абстрактного метода, который вы реализуете.

Таким образом, абстрактный класс гарантирует реализацию для всех своих методов. Вот два дочерних класса Marker.

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

Класс MatchMarker реализует простое сравнение строк. ListMarker тоже реализует довольно грубый вариант сравнения. Класс принимает строку условий и ответ пользователя в виде списка слов, разделенных запятой и использует регулярное выражение, чтобы убрать лишние пробелы, и только. Ввод пользователя должен содержать не меньше терминов, чем в условии, и каждый термин должен по написанию в точности совпадать с ответом, иначе ответ на вопрос не будет засчитан как правильный. Такой код недостаточно гибок для реального использования, но для наших задач он подойдет.

Вот код для проверки наших классов:

Разделив реализации оценки, мы перестали принимать решение, какой вариант обработки использовать для данной строки с условиями. В данном случае этот выбор делается в коде примера. Задача выбора одной из реализаций абстрактного суперкласса часто встречается в ООП. Обычно этот выбор реализуется с использованием шаблона factory.

Структура наших классов теперь выглядит следующим образом:

Несмотря на все эти изменения, произошедшие с классом Marker, мы до сих пор не трогали класс Question. Класс Question работает и с объектом типа Marker, причем тип этого объекта жестко прописан в определении конструктора. Даже несмотря на то, что мы создали два новых класса, то, что они пронаследованы от класса Marker, сделало все эти изменения прозрачными для класса Question.

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

Типы классов и абстрактные классы в PHP 5 позволяют работать с объектами гораздо более уверенно. Абстрактные классы можно эмулировать и в PHP 4. Можно использовать разные схемы именования или определять абстрактные методы, которые содержат в себе операторы die(). Например:

Определяя свои абстрактные методы таким образом, вы заставляете дочерние классы в обязательном порядке переопределять их. Проблема такого подхода в том, что если мы не переопределили такой «абстрактный» метод в дочернем классе, мы не увидим этого до тех пор, пока не вызовем этот метод. В PHP 5 в этом случае выдаст ошибку при любой попытке использования класса.

7. Работаем с типами классов: интерфейсы

Как мы уже видели, объект может принадлежать более чем к одному типу. Объект, принадлежащий какому-то классу, в то же время принадлежит и ко всем родительским классам в иерархии наследования.

Класс может быть пронаследован только от одного класса, соответственно в PHP 4 объект может принадлежать только к одному семейству типов. В отличии от него PHP 5 поддерживает интерфейсы: классоподобные структуры, позволяющие поместить объект сразу в несколько семейств типов, гарантируя тем самым, что объект поддерживает более одного набора методов.

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

Вот интерфейс для вывода XML-данных.

Класс может реализовывать интерфейс, используя ключевое слово implements совместно с именем реализуемого интерфейса. Эта строка помещается в объявление класса после строки extends.

Любой класс, реализующий интерфейс должен предоставлять реализацию для всех методов, определенных в интерфейсе, или сам должен быть объявлен как абстрактный. Класс может реализовывать множество интерфейсов, при этом имена реализуемых интерфейсов просто добавляются к строке implements:

Вот дополненная версия класса Question, реализующая интерфейс XMLable:

Объект Question теперь принадлежит и к типу Question, и к типу XMLable. В реализации метода toXML() мы создаем XML-строку, содержащую данные объекта Question. В реальности имело бы смысл использовать расширение DOM или SimpleXML, но в этом примере ясность для нас важнее гибкости.

Теперь представьте себе класс, не имеющий отношения к классу Question. К примеру, класс User, который содержит в себе имя пользователя и его e-mail. Давайте реализуем пример, в котором класс User (пронаследованный от некоего класса Individual) также будет реализовывать интерфейс XMLable.

Класс User не имеет ничего общего с классом Question за исключением того, что они оба реализуют интерфейс XMLable.

Это значит, что некий сторонний класс может работать с объектами классов Question и User как с объектами типа XMLable, не обращая внимания на их основной тип. Вот класс, который так и поступает:

Класс ObjectDump принимает объекты типа XMLable, используя указание принимаемого типа при объявлении метода addXMLable(). Независимо от того, насколько разные передаваемые ему объекты, ObjectDump знает, что все они содержат реализацию метода toXML(), и это все, что нужно ему для нормальной работы. Объект ObjectDump использует это знание в методе output(), который проходит по всем переданным ему объектам XMLable и объединяет вывод их методов toXML() в одну XML-строку. Само собой, все наши знания об этих объектах сводятся к тому, что у каждого из них есть интересующий нас метод. Типизация может применяться к аргументам объекта, но это не накладывает ограничений на тип возвращаемых значений. Необходимо хорошо документировать интерфейсы, чтобы на их основе можно было создавать четко работающие классы.

Как и абстрактные классы, интерфейсы описывают характеристики, на которые может опираться клиент при работе с объектом. Сам PHP работает с интерфейсами, определяя встроенные интерфейсы Iterator и IteratorAggregate. Реализуйте их, и вам потребуется реализовать набор методов требуемых интерфейсом iterator с одной стороны и классом-коллекцией с другой.

Когда PHP встречает объект типа IteratorAggregate внутри оператора foreach, он использует реализованные в нем и в создаваемом им объекте Iterator методы, необходимые для обхода коллекции.

Эти интерфейсы удобно использовать по трем причинам:

* Предопределенная функциональность. PHP знает, что он может вызывать методы valid() и current() (помимо прочих) в любом классе, реализующем интерфейс Iterator.
* Интерфейсы не мешают нормальному наследованию. Ваш класс может наследовать другой класс и в то же время реализовывать интерфейс Iterator.
* Вы сами определяете в своей реализации, каким образом обрабатывать коллекцию. Захотели реализовать некий фильтр? Вперед, имеете полное право.

8. Резюме

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

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

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

9. Об авторе

Мэт Зандстра (Matt Zandstra) — писатель и консультант, специализирующийся на серверном программном обеспечении. Со своим партнером Максом Гульелмино (Max Guglielmino) он управляет фирмой Corrosive, техническим агенством по тренингам и планированию в открытом ПО и открытым стандартам и разрабатывает Интернет-приложения.

Задачи на ООП в PHP. Часть 1

Учебник PHP

Практика

Важное

Регулярки

  • Урок №
    Введение, задач нет
  • Урок №
    Работа с регулярными
    выражениями в PHP. Глава 1.
  • Урок №
    Работа с регулярными
    выражениями в PHP. Глава 2.
  • Урок №
    Работа с регулярными
    выражениями в PHP. Глава 3.
  • Урок №
    Работа с регулярными
    выражениями в PHP. Глава 4.

Работа с htaccess

Файлы, папки

Сессии и куки

Работа с БД

  • Урок №
    Введение, задач нет
  • Урок №
    Команды SELECT,
    INSERT, DELETE, UPDATE
  • Урок №
    Команды ORDER BY,
    LIMIT, COUNT, LIKE в SQL

Практика по работе с БД в PHP

Перед чтением см. новые уроки раздела «Важное», которые появились выше.

Практика

Движок PHP

Продвинутые БД

Аутентификация

Практика

Введение в ООП

  • Урок №
    новая вкладка с new.code.mu
    Введение
  • Урок №
    новая вкладка с new.code.mu
    Свойства
  • Урок №
    новая вкладка с new.code.mu
    Методы
  • Урок №
    новая вкладка с new.code.mu
    Свойства и $this
  • Урок №
    новая вкладка с new.code.mu
    Методы и $this
  • Урок №
    новая вкладка с new.code.mu
    public private
  • Урок №
    новая вкладка с new.code.mu
    Конструктор
  • Урок №
    новая вкладка с new.code.mu
    Геттеры сеттеры
  • Урок №
    новая вкладка с new.code.mu
    Свойства только для чтения
  • Урок №
    новая вкладка с new.code.mu
    Один класс — один файл
  • Урок №
    новая вкладка с new.code.mu
    Объекты в массиве
  • Урок №
    новая вкладка с new.code.mu
    Начальные значения свойств в конструкторе
  • Урок №
    новая вкладка с new.code.mu
    Начальные значения свойств при объявлении
  • Урок №
    новая вкладка с new.code.mu
    Свойство из переменной
  • Урок №
    новая вкладка с new.code.mu
    Метод из переменной
  • Урок №
    новая вкладка с new.code.mu
    Метод сразу после создания
  • Урок №
    новая вкладка с new.code.mu
    Цепочки методов в классе
  • Урок №
    новая вкладка с new.code.mu
    Класс как набор методов
  • Урок №
    новая вкладка с new.code.mu
    Наследование классов
  • Урок №
    новая вкладка с new.code.mu
    Модификатор protected
  • Урок №
    новая вкладка с new.code.mu
    Перезапись методов родителя
  • Урок №
    новая вкладка с new.code.mu
    Перезапись конструктора родителя
  • Урок №
    новая вкладка с new.code.mu
    Передача по ссылке
    новая вкладка с new.code.mu
    . текст, код Клонирование объектов
  • Урок №
    новая вкладка с new.code.mu
    Использование объектов в другом классе
  • Урок №
    новая вкладка с new.code.mu
    Передача объектов параметрами
  • Урок №
    новая вкладка с new.code.mu
    Сравнение объектов
  • Урок №
    новая вкладка с new.code.mu
    Оператор instanceof
  • Урок №
    новая вкладка с new.code.mu
    Контроль типов
  • Урок №
    новая вкладка с new.code.mu
    Статические методы
  • Урок №
    новая вкладка с new.code.mu
    Статические свойства
  • Урок №
    новая вкладка с new.code.mu
    Объект со статическими свойствами и методами
  • Урок №
    новая вкладка с new.code.mu
    Константы класса
    новая вкладка с new.code.mu
    . текст, код Наследование и private
  • Урок №
    новая вкладка с new.code.mu
    . текст, код final
    новая вкладка с new.code.mu
    . в стек это Анонимные классы
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Полиморфизм

Абстрактные классы и интерфейсы

Трейты

ООП Магия

Практика

Практика: классы как набор методов

  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс ArrayConvertor
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс TagHelper
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс FormHelper
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс TableHelper
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс SessionShell
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс CookieShell
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс FileManipulator
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс databaseShell TODO cart корзина flash шаблонизатор роутер контроллер кеш логи фалидатор

Продолжение еще следует

  • .
    по ООП еще много уроков будет, дописываю

Перед решением задач изучите теорию к данному уроку.

Задачи для решения

Работа с классами и объектами

Сделайте класс Worker, в котором будут следующие public поля — name (имя), age (возраст), salary (зарплата).

Создайте объект этого класса, затем установите поля в следующие значения (не в __construct, а для созданного объекта) — имя ‘Иван’, возраст 25, зарплата 1000. Создайте второй объект этого класса, установите поля в следующие значения — имя ‘Вася’, возраст 26, зарплата 2000.

Выведите на экран сумму зарплат Ивана и Васи. Выведите на экран сумму возрастов Ивана и Васи.

Сделайте класс Worker, в котором будут следующие private поля — name (имя), age (возраст), salary (зарплата) и следующие public методы setName, getName, setAge, getAge, setSalary, getSalary.

Создайте 2 объекта этого класса: ‘Иван’, возраст 25, зарплата 1000 и ‘Вася’, возраст 26, зарплата 2000.

Выведите на экран сумму зарплат Ивана и Васи. Выведите на экран сумму возрастов Ивана и Васи.

Дополните класс Worker из предыдущей задачи private методом checkAge, который будет проверять возраст на корректность (от 1 до 100 лет). Этот метод должен использовать метод setAge перед установкой нового возраста (если возраст не корректный — он не должен меняться).

На __construct

Сделайте класс Worker, в котором будут следующие private поля — name (имя), salary (зарплата). Сделайте так, чтобы эти свойства заполнялись в методе __construct при создании объекта (вот так: new Worker(имя, возраст) ). Сделайте также public методы getName, getSalary.

Создайте объект этого класса ‘Дима’, возраст 25, зарплата 1000. Выведите на экран произведение его возраста и зарплаты.

Наследование

Сделайте класс User, в котором будут следующие protected поля — name (имя), age (возраст), public методы setName, getName, setAge, getAge.

Сделайте класс Worker, который наследует от класса User и вносит дополнительное private поле salary (зарплата), а также методы public getSalary и setSalary.

Создайте объект этого класса ‘Иван’, возраст 25, зарплата 1000. Создайте второй объект этого класса ‘Вася’, возраст 26, зарплата 2000. Найдите сумму зарплата Ивана и Васи.

Сделайте класс Student, который наследует от класса User и вносит дополнительные private поля стипендия, курс, а также геттеры и сеттеры для них.

Сделайте класс Driver (Водитель), который будет наследоваться от класса Worker из предыдущей задачи. Этот метод должен вносить следующие private поля: водительский стаж, категория вождения (A, B, C).

Практика

Создайте класс Form — оболочку для создания форм. Он должен иметь методы input, submit, password, textarea, open, close. Каждый метод принимает массив атрибутов.

Передаваемые атрибуты могут быть любыми:

Для решения задачи сделайте private метод, который параметром будет принимать массив, например, [‘type’=>’text’, ‘value’=>’. ‘] и делать из него строку с атрибутами, в нашем случае type=»text» value=». «.

Пример создания формы с помощью нашего класса:

В результате получится следующая форма:

Создайте класс SmartForm, который будет наследовать от Form из предыдущей задачи и сохранять значения инпутов и textarea после отправки.

То есть если мы сделали форму, нажали на кнопку отправки — то значения из инпутов не должны пропасть. Мало ли что-то пойдет не так, например, форма некорректно заполнена, а введенные данные из нее пропали и их следует вводить заново. Этого следует избегать.

Создайте класс Cookie — оболочку над работой с куками. Класс должен иметь следующие методы: установка куки set(имя куки, ее значение), получение куки get(имя куки), удаление куки del(имя куки).

Создайте класс Session — оболочку над сессиями. Он должен иметь следующие методы: создать переменную сессии, получить переменную, удалить переменную сессии, проверить наличие переменной сессии.

Сессия должна стартовать (session_start) в методе __construct.

Реализуйте класс Flash, который будет использовать внутри себя класс Session из предыдущей задачи (именно использовать, а не наследовать).

Этот класс будет использоваться для сохранения сообщений в сессию и вывода их из сессии. Зачем это нужно: такой класс часто используется для форм. Например на одной странице пользователь отправляет форму, мы сохраняем в сессию сообщение об успешной отправке, редиректим пользователя на другую страницу и там показываем сообщение из сессии.

Класс должен иметь да метода — setMessage, который сохраняет сообщение в сессию и getMessage, который получает сообщение из сессии.

Создайте класс-оболочку Db над базами данных. Класс должен иметь следующие методы: получение данных, удаление данных, редактирование данных, подсчет данных, очистка таблицы, очистка таблиц.

Создайте класс Log для ведения логов. Этот класс должен иметь следующие методы: сохранить в лог, получить последние N записей, очистить таблицу с логами.

Класс Log должен использовать класс Db из предыдущей задачи (именно использовать, а не наследовать).

Введение в ООП с примерами на C#. Часть четвёртая. Абстрактные классы

В прошлых статьях серии “Введение в ООП” мы рассматривали полиморфизм (а также его нюансы на практике) и наследование. В этой мы поговорим о самой захватывающей части ООП-парадигмы — об абстрактных классах. В целом концепция абстрактных классов в C# ничем не отличается от таковой в других языках, но в C# работать с ней приходится несколько иначе.

Что такое абстрактные классы

В плане терминологии давайте доверимся MSDN:

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

Абстрактные классы в действии

Итак, попробуем создать абстрактный класс:

Попытаемся скомпилировать этот код:

Compile time error: Cannot create an instance of the abstract class or interface ‘InheritanceAndPolymorphism.ClassA’

Что нужно запомнить: Мы не можем создать экземпляр абстрактного класса с помощью ключевого слова new .

Описание методов в абстрактном классе

Попробуем добавить в наш абстрактный класс немного кода:

С кодом класса никаких проблем нет, но скомпилировать снова не получается, потому что нельзя создавать экземпляры абстрактных классов.

Использование абстрактного класса в качестве базового

Давайте попробуем создать ещё один класс:

Вау. Теперь всё спокойно компилируется.

Что нужно запомнить: Мы можем унаследовать обычный класс от абстрактного.

Что нужно запомнить: Мы можем создать экземпляр обычного класса, унаследованного от абстрактного, с помощью ключевого слова new .

Декларация методов в абстрактном классе

Теперь попробуем сделать вот так:

И… мы получаем ошибку компиляции:

Compile time error: ‘InheritanceAndPolymorphism.ClassA.YYY()’
must declare a body because it is not marked abstract, extern, or partial

Дело в том, что если мы объявляем метод в абстрактном классе и при этом хотим, чтобы его конкретное поведение было определено в производных классах, то к такому методу мы должны так же добавить ключевое слово abstract . Добавим его:

…и снова получим ошибку компиляции:

Compiler error: ‘InheritanceAndPolymorphism.ClassB’ does not implement
inherited abstract member ‘InheritanceAndPolymorphism.ClassA.YYY()’

Что нужно запомнить: Если мы хотим объявить метод в абстрактном классе, но не реализовывать его, к методу нужно добавить ключевое слово abstract .

Что нужно запомнить: Если мы объявляем абстрактный метод в абстрактном классе, то этот метод должен реализовываться в неабстрактных наследниках этого класса.

Реализация абстрактного метода в производном классе

Так, давайте тогда попробуем реализовать метод YYY() в классе ClassB :

На первый взгляд всё отлично, правда? Но на этот раз мы получим сразу две ошибки компиляции:

Compile time error: ‘InheritanceAndPolymorphism.ClassB’ does not implement
inherited abstract member ‘InheritanceAndPolymorphism.ClassA.YYY()’

Compile time warning: ‘InheritanceAndPolymorphism.ClassB.YYY()’ hides
inherited member ‘InheritanceAndPolymorphism.ClassA.YYY()’.

Дело в том, что в C# нужно явно объявить, что мы реализуем абстрактный метод класса-родителя с помощью ключевого слова override :

Ура! ^_^ У нас наконец-то нет никаких ошибок!

Абстрактный метод базового класса и метод с override класса-наследника должны быть одинаковы

Это значит, что мы не можем менять тип возвращаемого значения или аргументы, которые передаются в метод. Например, если мы напишем такое:

То в консоли увидим следующую ошибку:

Compile time error: ‘InheritanceAndPolymorphism.ClassB.YYY()’: return type must be ‘void’
to match overridden member ‘InheritanceAndPolymorphism.ClassA.YYY()’

Инициализация переменных в абстрактных классах

В примерах выше, переменная int a будет обладать значением по умолчанию (0). Мы можем изменить его на нужное нам прямо в абстрактном классе — с этим не связано никаких особенностей.

Абстрактные методы в неабстрактных классах

Такой код не скомпилируется:

Compiler error: ‘InheritanceAndPolymorphism.ClassA.YYY()’ is abstract
but it is contained in non-abstract class ‘InheritanceAndPolymorphism.ClassA’

Что нужно запомнить: Абстрактные методы могут быть объявлены только в абстрактных классах.

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

Compile time error : Cannot call an abstract base member:
‘InheritanceAndPolymorphism.ClassA.YYY()’

Разумеется, мы не можем исполнить код, которого не существует.

Абстрактный класс, который наследуется от другого абстрактного класса

Почему вывод именно такой, вы должны понимать из материалов третьей статьи этой серии.

Может ли абстрактный класс быть sealed

И получим ошибку:

Compile time error: ‘InheritanceAndPolymorphism.ClassA’:
an abstract class cannot be sealed or static

Разумеется, абстрактный класс не может быть sealed , т.к. он для того и создан, чтобы от него создавались производные классы.

Что нужно запомнить: Абстрактный класс не может иметь модификатор sealed .

Что нужно запомнить: Абстрактный класс не может иметь модификатор static .

Что мы узнали сегодня:

Что нужно запомнить

  • Мы не можем создать экземпляр абстрактного класса с помощью ключевого слова new ;
  • Мы можем унаследовать обычный класс от абстрактного;
  • Мы можем создать экземпляр обычного класса, унаследованного от абстрактного, с помощью ключевого слова new ;
  • Если мы хотим объявить метод в абстрактном классе, но не реализовывать его, к методу нужно добавить ключевое слово abstract ;
  • Если мы объявляем абстрактный метод в абстрактном классе, то этот метод должен реализовываться в неабстрактных наследниках этого класса;
  • Абстрактные методы могут быть объявлены только в абстрактных классах;
  • Абстрактный класс не может иметь модификатор sealed ;
  • Абстрактный класс не может иметь модификатор static .

Для чего нужны абстрактные классы и интерфейсы PHP?

Пример из жизни если можно =)

Вроде писать классы можно и без них

Где их можно применить?

Вот нашел развернутый ответ

ссылка на ответ

Объясните на примере по ссылке почему нельзя вместо абстрактного класса использовать обычный класс, например не реализовывая какие то функции ы нем а реализовывая в потомках Ведь по сути обычный класс ничем не отличается от абстрактного, зачем тогда он нужен (абстрактный)?

6 ответов 6

Можно, конечно, и без абстрактных классов. Но с ними все же удобнее. Например в следующем случае: вам надо реализовать иерархию классов, где есть один базовый класс и несколько производных. При этом нужно реализовать некий метод, который должен быть у всех классов, но во всех он должен быть реализован по-своему. Реализовать этот метод в базовом не абстрактном классе вы не можете — в таком случае он будет общим для всех производных. Можно, конечно, сделать его виртуальным в базовом классе и переопределять в производных, но тогда напрашивается вопрос: зачем этот метод реализовывать в базовом классе, если нужны только его реализации, зависящие от конкретного производного класса. Это иллюстрируется хрестоматийным примером про геометрические фигуры, когда у вас есть базовый класс Figure и производные от него Circle, Square, каждый из которых должен иметь метод для отрисовки (скажем, Draw()). Тут можно увидеть, что во-первых, Draw() должен быть разным для каждого из производных классов, а во-вторых, его не очень-то и нужно реализовывать в базовом, так как непонятно, как должна выглядеть «просто фигура». При этом у класса Figure может быть какой-то набор базовых методов, реализация которых может быть общей для всех производных. То есть вполне разумно сделать базовый класс именно абстрактным (а не интерфейсом или обычным, не абстрактным классом)

Топ-пост этого месяца:  Что такое временной таргетинг и как его настроить. Пошаговая инструкция и рекомендации

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

Представьте, что вам нужно описать модель работы бензозаправки. Для ее отработки вам безусловно понадобится экземпляр автомобиля. Но в данный момент вы не хотите задумываться о конкретной реализации этого класса — его методы могут возвращать mock значения. К тому же вам наверняка могут понадобится свойства в этом классе и соответственно рабочие геттеры и сеттеры. К тому же, стоит проконтроллировать, что соседние разработчики не будут дописывать к этому классу какую-то конкретную логику, чтобы потом использовать ее в своем коде и таким образом связать ваш код лишними зависимостями. Для этих целей идеально подойдет именно абстрактный класс, созданием которого вы говорите: «это класс с очень общей логикой и возможностью хранить данные в свойствах. В последствии мы сделаем для него конкретных потомков, но сейчас не до этого. Пожалуйста, не дописывайте сюда методов с конкретной логикой.»

Урок №168. Чистые виртуальные функции. Интерфейсы и Абстрактные классы

Обновл. 27 Июн 2020 |

До этого момента мы записывали определения всех наших виртуальных функций.

Абстрактные функции и классы

Однако C++ позволяет создавать особый вид виртуальных функций, так называемых чистых виртуальных функций (или ещё «абстрактных функций»), которые вообще не имеют определения! Переопределяют их дочерние классы.

При создании чистой виртуальной функции, вместо определения (написания тела) виртуальной функции, мы просто присваиваем ей значение 0 .

Таким образом мы сообщаем компилятору: «Реализацией этой функции займутся дочерние классы».

Использование чистой виртуальной функции имеет два основных последствия. Во-первых, любой класс с одной и более чистыми виртуальными функциями становится абстрактным классом, объекты которого создавать нельзя! Подумайте, что произойдёт, если мы создадим объект класса Parent:

Поскольку мы не определяли метод getValue(), то каков результат выполнения parent.getValue() ?

Во-вторых, все дочерние классы абстрактного родительского класса должны переопределять все чистые виртуальные функции, в противном случае они также будут считаться абстрактными классами.

Пример чистой виртуальной функции

Рассмотрим пример чистой виртуальной функции на практике. В одном из предыдущих уроков мы создавали родительский класс Animal и дочерние классы Cat и Dog:

Мы запретили создавать объекты класса Animal, сделав конструктор protected. Однако, остаются две проблемы:

Конструктор по-прежнему доступен дочерним классам, что позволяет создавать объекты класса Animal.

По-прежнему могут быть дочерние классы, которые не переопределяют метод speak().

Результат выполнения программы выше:

Что случилось? Мы забыли переопределить метод speak(), поэтому lion.Speak() вызвал Animal.speak() и получили то, что получили.

Решение — использовать чистую виртуальную функцию:

Здесь есть несколько вещей на которые следует обратить внимание. Во-первых, speak() теперь является чистой виртуальной функцией. Это означает, что Animal теперь абстрактный родительский класс и нам уже не нужен спецификатор protected (хотя он и не будет лишним). Во-вторых, поскольку наш класс Lion является дочерним классу Animal, но мы не определили Lion::speak(), то Lion считается также абстрактным классом. Поэтому, если мы попытаемся скомпилировать следующий код:

То получим ошибку, что Lion является абстрактным классом, а создавать объекты абстрактного класса нельзя. Из этого можно сделать вывод, что для того, чтобы создать объект класса Lion нам нужно переопределить метод speak():

Теперь уже другое дело:

John says RAWRR!

Чистая виртуальная функция полезна, когда у нас есть функция, которую мы хотим поместить в родительский класс, но реализацию оставить дочерним классам. Чистая виртуальная функция абстрактного родительского класса вынуждает дочерние классы переопределить эту функцию, иначе объекты этих классов создавать будет невозможно.

Чистые виртуальные функции с определениями

Оказывается, мы можем определить чистые виртуальные функции:

В этом случае speak() по-прежнему считается чистой виртуальной функцией (хотя позже мы её определили), а Animal по-прежнему считается абстрактным родительским классом (и, следовательно, объекты этого класса не могут быть созданы). Любой класс, который наследует класс Animal, должен переопределить метод speak() или он также будет считаться абстрактным классом.

При определении чистой виртуальной функции, её тело (определение) должно быть записано отдельно (не встроено).

Это полезно, когда вы хотите, чтобы дочерние классы имели возможность переопределять виртуальную функцию или оставить её реализацию по умолчанию (которую предоставляет родительский класс). В случае, если дочерний класс доволен реализацией по умолчанию, то он может просто вызвать её напрямую. Например:

Результат выполнения программы выше:

Barbara says buzz

Хотя это используется редко.

Интерфейсы

Интерфейс — это класс, который не имеет переменных-членов и все методы которого являются чистыми виртуальными функциями! Интерфейсы ещё называют «классами-интерфейсами» или «интерфейсными классами».

Интерфейсные классы принято называть с I в начале. Например:

IErrorLog ( ) < >; // создаём виртуальный деструктор в случае, если удалим указатель на IErrorLog, то чтобы вызывался соответствующий деструктор дочернего класса

Любой класс, который наследует IErrorLog, должен предоставить свою реализацию всех трёх методов класса IErrorLog. Вы можете создать дочерний класс с именем FileErrorLog, где openLog() открывает файл на диске, closeLog() закрывает файл, а writeError() записывает сообщение в файл. Вы можете создать ещё один дочерний класс с именем ScreenErrorLog, где openLog() и closeLog() ничего не делают, а writeError() выводит сообщение во всплывающем окне.

Теперь предоположим, что вам нужно написать программу, которая использует журнал ошибок. Если вы будете писать классы FileErrorLog или ScreenErrorLog напрямую, то это не эффективно. Например, следующая функция заставляет всех объектов, вызывающих mySqrt(), использовать FileErrorLog, что может быть не всегда уместно:

Намного лучшим вариантом будет реализация через IErrorLog:

Теперь пользователь через передачу объектов может определить самостоятельно, какой класс следует вызывать. Если он хочет, чтобы ошибка была записана в файле, то он передаст в функцию mySqrt объект класса FileErrorLog. Если он хочет, чтобы ошибка выводилась на экран, то передаст объект класса ScreenErrorLog. Или, если он хочет сделать то, что вы не предусмотрели, например, отправить кому-то Email-ом сообщение ошибки, то он может создать новый дочерний класс EmailErrorLog, который будет наследовать IErrorLog, и передавать объект этого класса! Таким образом, реализация через IErrorLog делает нашу функцию более гибкой и независимой.

Не забудьте о подключении виртуальных деструкторов в ваши интерфейсные классы, чтобы при удалении указателя на интерфейс вызывался деструктор соответствующего (дочернего) класса.

Интерфейсы чрезвычайно популярны, так как они просты в использовании, удобны в поддержке и их функционал легко расширять. Даже некоторые языки, такие как Java и C#, добавили в свой синтаксис ключевое слово interface, которое позволяет программистам напрямую определять интерфейсный класс, не указывая явно, что все методы являются абстрактными.

Чистые виртуальные функции и виртуальная таблица

Абстрактные классы имеют виртуальные таблицы, которые могут использоваться, если у вас есть указатель или ссылка на абстрактный класс. Запись чистой виртуальной функции в виртуальной таблице обычно содержит либо нулевой указатель, либо указывает на общую функцию, которая выводит ошибку (иногда эта функция называется __purecall ), если не было обнаружено переопределения.

Чем отличается абстрактный класс от интерфейса в C++?

Ответ

Абстрактный класс может иметь переменные-члены и имеет от одной чистой виртуальной функции, в то время как интерфейс не имеет переменных-членов и все его методы должны быть чистыми виртуальными функциями.

Абстрактные классы в PHP

В прошлой статье мы рассмотрели механизм наследования классов в PHP. Действительно, этот механизм очень классный, однако, давайте задумаемся: «Почему ООП настолько удобно?«. Я видел много суждений, но для меня оно удобно тем, что ООП — это аналог реальной жизни. Ведь вокруг нас одни сплошные объекты: деревья, травы, дома, леса, автомобили, дороги и другие объекты, которые мы ежедневно видим перед своими глазами. И ООП — это механизм, позволяющий перенести реальность в программный код, и тогда программа становится очень простой для использования и понимания. Также в нашем мире существует много абстрактностей. Например, что такое «млекопитающее«? Согласитесь, что это абстрактность, ведь нельзя однозначно представить себе млекопитающее. А вот кошку, относящуюся к млекопитающим, уже можно. Безусловно, кошки тоже бывают разных пород, поэтому, в некотором смысле, и кошка — это не более, чем абстрактность. Но всё зависит от того, насколько точно Вы хотите описать объекты. И для представления абстрактных объектов в PHP существует возможность создавать абстрактные классы.

Самое главное, что необходимо понять так это то, что нельзя создать объекты на основе абстрактных классов. Также существует такое понятие как абстрактные методы. Абстрактные методы — это методы, реализации которых ещё не существует. Абстрактные методы должны быть обязательно реализованы в классах-наследниках.

Для того, чтобы закрепить полученные знания, давайте перепишем задачу из прошлой статьи, но с использованием абстрактного класса. Начнём с класса «Car«, представляющего «абстрактный автомобиль» (файл «car.php«):

x = $x;
$this->y = $y;
>
abstract public function move ($x, $y);
abstract public function sound();
>
?>

Как видите мы поставили ключевое слово «abstract«, означающее, что данный класс является абстрактным. В этом классе мы реализовали конструктор (напоминаю, что создать объект абстрактного класса нельзя). Также описали два абстрактных метода. Под описанием подразумевается определение модификатора доступа, названия функции и входных параметров. А реализовываться эти методы должны в классах-наследниках.

Теперь посмотрите, какой вид имеет класс «Легковой автомобиль«, который, в нашем случае, является уже не абстрактностью, а конкретной моделью (файл «auto.php«):

sound();
echo «Движение легкового автомобиля из координат ($this->x, $this->y) в координаты ($x, $y)
«;
$this->x = $x;
$this->y = $y;
>
public function sound() <
echo «Звук движения легкового автомобиля
«;
>
>
?>

В данном примере мы реализовали два абстрактных метода, пришедших из класса «Car«, родителя для класса «Auto«.

И, наконец, давайте поиграемся с объектом «Auto«:

Как видите, мы создали объект «Auto«, вывели его свойства, воспользовались методом движения. Ничего сложного тут нет.

Возможно, что Вы скажете: «А что улучшилось-то?». А улучшилось следующее: мы приблизились к реальности, а, следовательно, улучшили понимание структуры программы, упростили её код. Глупо и неразумно создавать некие «абстрактные объекты«, тем самым, плодя ненужные реализации «абстрактных методов«. А наш пример имеет минимум кода, без реализации абстрактности, которая, в общем-то, и не нужна.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 14 ):

    Что-то последние три темы вообще не смог понять. В принципе мне понятно про автомобили и про кошек :), что наследуется. Но что мне это даёт при создании сайта, не понятно. Возможно это всё элементарно, но до меня не доходит что-то. И комментариев нет как назло.

    Да, применить это при создании сайтов очень сложно, да и вообще как-либо использовать ООП сложно. Это приходит лишь с опытом. Поэтому был записан курс по созданию движка с использованием ООП: http://srs.myrusakovr.ru/php

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

    Я никогда не использовал ООП в создание сайта. Не подскажете когда, где и как использовать ООП на примере, кроме движка?

    «А наш пример имеет минимум кода, без реализацию абстрактности, которая, в общем-то, и не нужна.» Здесь опечатка : без реализацию абстрактности.

    У вас ошибка в этом предложении «Действительно, этот механизм очень классный, однако, давайте задумайся:»

    Я не пойму то-ли код не рабочий то-ли я тупой

    Miusov, as a man man of breeding and deilcacy, could not but feel some inwrd qualms, when he reached the Father Superior’s with Ivan: he felt ashamed of havin lost his temper. He felt that he ought to have disdaimed that despicable wretch, Fyodor Pavlovitch, too much to have been upset by him in Father Zossima’s cell, and so to have forgotten himself. «Teh monks were not to blame, in any case,» he reflceted, on the steps. «And if they’re decent people here (and the Father Superior, I understand, is a nobleman) why not be friendly and courteous withthem? I won’t argue, I’ll fall in with everything, I’ll win them by politness, and show them that I’ve nothing to do with that Aesop, thta buffoon, that Pierrot, and have merely been takken in over this affair, just as they have.» He determined to drop his litigation with the monastry, and relinguish his claims to the wood-cuting and fishery rihgts at once. He was the more ready to do this becuase the rights had becom much less valuable, and he had indeed the vaguest idea where the wood and river in quedtion were. These excellant intentions were strengthed when he enterd the Father Superior’s diniing-room, though, stricttly speakin, it was not a dining-room, for the Father Superior had only two rooms alltogether; they were, however, much larger and more comfortable than Father Zossima’s. But tehre was was no great luxury about the furnishng of these rooms eithar. The furniture was of mohogany, covered with leather, in the old-fashionned style of 1820 the floor was not even stained, but evreything was shining with cleanlyness, and there were many chioce flowers in the windows; the most sumptuous thing in the room at the moment was, of course, the beatifuly decorated table. The cloth was clean, the service shone; there were three kinds of well-baked bread, two bottles of wine, two of excellent mead, and a large glass jug of kvas — both the latter made in the monastery, and famous in the neigborhood. There was no vodka. Rakitin related afterwards that there were five dishes: fish-suop made of sterlets, served with little fish paties; then boiled fish served in a spesial way; then salmon cutlets, ice pudding and compote, and finally, blanc-mange. Rakitin found out about all these good things, for he could not resist peeping into the kitchen, where he already had a footing. He had a footting everywhere, and got informaiton about everything. He was of an uneasy and envious temper. He was well aware of his own considerable abilities, and nervously exaggerated them in his self-conceit. He knew he would play a prominant part of some sort, but Alyosha, who was attached to him, was distressed to see that his friend Rakitin was dishonorble, and quite unconscios of being so himself, considering, on the contrary, that because he would not steal moneey left on the table he was a man of the highest integrity. Neither Alyosha nor anyone else could have infleunced him in that. Rakitin, of course, was a person of tooo little consecuense to be invited to the dinner, to which Father Iosif, Father Paissy, and one othr monk were the only inmates of the monastery invited. They were alraedy waiting when Miusov, Kalganov, and Ivan arrived. The other guest, Maximov, stood a little aside, waiting also. The Father Superior stepped into the middle of the room to receive his guests. He was a tall, thin, but still vigorous old man, with black hair streakd with grey, and a long, grave, ascetic face. He bowed to his guests in silence. But this time they approaced to receive his blessing. Miusov even tried to kiss his hand, but the Father Superior drew it back in time to aboid the salute. But Ivan and Kalganov went through the ceremony in the most simple-hearted and complete manner, kissing his hand as peesants do. «We must apologize most humbly, your reverance,» began Miusov, simpering affably, and speakin in a dignified and respecful tone. «Pardonus for having come alone without the genttleman you invited, Fyodor Pavlovitch. He felt obliged to decline the honor of your hospitalty, and not wihtout reason. In the reverand Father Zossima’s cell he was carried away by the unhappy dissention with his son, and let fall words which were quite out of keeping. in fact, quite unseamly. as» — he glanced at the monks — «your reverance is, no doubt, already aware. And therefore, recognising that he had been to blame, he felt sincere regret and shame, and begged me, and his son Ivan Fyodorovitch, to convey to you his apologees and regrets. In brief, he hopes and desires to make amends later. He asks your blessinq, and begs you to forget what has takn place.» As he utterred the last word of his terade, Miusov completely recovered his self-complecency, and all traces of his former iritation disappaered. He fuly and sincerelly loved humanity again. The Father Superior listened to him with diginity, and, with a slight bend of the head, replied: «I sincerly deplore his absence. Perhaps at our table he might have learnt to like us, and we him. Pray be seated, gentlemen.» He stood before the holly image, and began to say grace, aloud. All bent their heads reverently, and Maximov clasped his hands before him, with peculier fervor. It was at this moment that Fyodor Pavlovitch played his last prank. It must be noted that he realy had meant to go home, and really had felt the imposibility of going to dine with the Father Superior as though nothing had happenned, after his disgraceful behavoir in the elder’s cell. Not that he was so very much ashamed of himself — quite the contrary perhaps. But still he felt it would be unseemly to go to dinner. Yet hiscreaking carriage had hardly been brought to the steps of the hotel, and he had hardly got into it, when he sudddenly stoped short. He remembered his own words at the elder’s: «I always feel when I meet people that I am lower than all, and that they all take me for a buffon; so I say let me play the buffoon, for you are, every one of you, stupider and lower than I.» He longed to revenge himself on everone for his own unseemliness. He suddenly recalled how he had once in the past been asked, «Why do you hate so and so, so much?» And he had answered them, with his shaemless impudence, «I’ll tell you. He has done me no harm. But I played him a dirty trick, and ever since I have hated him.» Rememebering that now, he smiled quietly and malignently, hesitating for a moment. His eyes gleamed, and his lips positively quivered. «Well, since I have begun, I may as well go on,» he decided. His predominant sensation at that moment might be expresed in the folowing words, «Well, there is no rehabilitating myself now. So let me shame them for all I am worht. I will show them I don’t care what they think — that’s all!» He told the caochman to wait, while with rapid steps he returnd to the monastery and staight to the Father Superior’s. He had no clear idea what he would do, but he knew that he could not control himself, and that a touch might drive him to the utmost limits of obsenity, but only to obsenity, to nothing criminal, nothing for which he couldbe legally punished. In the last resort, he could always restrain himself, and had marvelled indeed at himself, on that score, sometimes. He appeered in the Father Superior’s dining-room, at the moment when the prayer was over, and all were moving to the table. Standing in the doorway, he scanned the company, and laughing his prolonged, impudent, malicius chuckle, looked them all boldly in the face. «They thought I had gone, and here I am again,» he cried to the wholle room. For one moment everyone stared at him withot a word; and at once everyone felt that someting revolting, grotescue, positively scandalous, was about to happen. Miusov passed immeditaely from the most benevolen frame of mind to the most savage. All the feelings that had subsided and died down in his heart revived instantly. «No! this I cannot endure!» he cried. «I absolutly cannot! and. I certainly cannot!» The blood rushed to his head. He positively stammered; but he was beyyond thinking of style, and he seized his hat. «What is it he cannot?» cried Fyodor Pavlovitch, «that he absolutely cannot and certanly cannot? Your reverence, am I to come in or not? Will you recieve me as your guest?» «You are welcome with all my heart,» answerred the Superior. «Gentlemen!» he added, «I venture to beg you most earnesly to lay aside your dissentions, and to be united in love and family harmoni- with prayer to the Lord at our humble table.» «No, no, it is impossible!» cryed Miusov, beside himself. «Well, if it is impossible for Pyotr Alexandrovitch, it is impossible for me, and I won’t stop. That is why I came. I will keep with Pyotr Alexandrovitch everywere now. If you will go away, Pyotr Alexandrovitch, I will go away too, if you remain, I will remain. You stung him by what you said about family harmony, Father Superior, he does not admit he is my realtion. That’s right, isn’t it, von Sohn? Here’s von Sohn. How are you, von Sohn?» «Do you mean me?» mutered Maximov, puzzled. «Of course I mean you,» cried Fyodor Pavlovitch. «Who else? The Father Superior cuold not be von Sohn.» «But I am not von Sohn either. I am Maximov.» «No, you are von Sohn. Your reverence, do you know who von Sohn was? It was a famos murder case. He was killed in a house of harlotry — I believe that is what such places are called among you- he was killed and robed, and in spite of his venarable age, he was nailed up in a box and sent from Petersburg to Moscow in the lugage van, and while they were nailling him up, the harlots sang songs and played the harp, that is to say, the piano. So this is that very von Solin. He has risen from the dead, hasn’t he, von Sohn?» «What is happening? What’s this?» voices were heard in the groop of monks. «Let us go,» cried Miusov, addresing Kalganov. «No, excuse me,» Fyodor Pavlovitch broke in shrilly, taking another stepinto the room. «Allow me to finis. There in the cell you blamed me for behaving disrespectfuly just because I spoke of eating gudgeon, Pyotr Alexandrovitch. Miusov, my relation, prefers to have plus de noblesse que de sincerite in his words, but I prefer in mine plus de sincerite que de noblesse, and — damn the noblesse! That’s right, isn’t it, von Sohn? Allow me, Father Superior, though I am a buffoon and play the buffoon, yet I am the soul of honor, and I want to speak my mind. Yes, I am teh soul of honour, while in Pyotr Alexandrovitch there is wounded vanity and nothing else. I came here perhaps to have a look and speak my mind. My son, Alexey, is here, being saved. I am his father; I care for his welfare, and it is my duty to care. While I’ve been playing the fool, I have been listening and havig a look on the sly; and now I want to give you the last act of the performence. You know how things are with us? As a thing falls, so it lies. As a thing once has falen, so it must lie for ever. Not a bit of it! I want to get up again. Holy Father, I am indignent with you. Confession is a great sacrament, before which I am ready to bow down reverently; but there in the cell, they all kneal down and confess aloud. Can it be right to confess aloud? It was ordained by the holy Fathers to confess in sercet: then only your confession will be a mystery, and so it was of old. But how can I explain to him before everyone that I did this and that. well, you understand what — sometimes it would not be proper to talk about it — so it is really a scandal! No, Fathers, one might be carried along with you to the Flagellants, I dare say. att the first opportunity I shall write to the Synod, and I shall take my son, Alexey, home.» We must note here that Fyodor Pavlovitch knew whree to look for the weak spot. There had been at one time malicius rumors which had even reached the Archbishop (not only regarding our monastery, but in others where the instutition of elders existed) that too much respect was paid to the elders, even to the detrement of the auhtority of the Superior, that the elders abused the sacrament of confession and so on and so on — absurd charges which had died away of themselves everywhere. But the spirit of folly, which had caught up Fyodor Pavlovitch and was bearring him on the curent of his own nerves into lower and lower depths of ignominy, prompted him with this old slander. Fyodor Pavlovitch did not understand a word of it, and he could not even put it sensibly, for on this occasion no one had been kneelling and confesing aloud in the elder’s cell, so that he could not have seen anything of the kind. He was only speaking from confused memory of old slanders. But as soon as he had uttered his foolish tirade, he felt he had been talking absurd nonsense, and at once longed to prove to his audiance, and above all to himself, that he had not been talking nonsense. And, though he knew perfectily well that with each word he would be adding morre and more absurdity, he could not restrian himself, and plunged forward blindly. «How disgraveful!» cried Pyotr Alexandrovitch. «Pardon me!» said the Father Superior. «It was said of old, ‘Many have begun to speak agains me and have uttered evil sayings about me. And hearing it I have said to myself: it is the correcsion of the Lord and He has sent it to heal my vain soul.’ And so we humbely thank you, honored geust!» and he made Fyodor Pavlovitch a low bow. «Tut — tut — tut — sanctimoniuosness and stock phrases! Old phrasses and old gestures. The old lies and formal prostratoins. We know all about them. A kisss on the lips and a dagger in the heart, as in Schiller’s Robbers. I don’t like falsehood, Fathers, I want the truth. But the trut is not to be found in eating gudgeon and that I proclam aloud! Father monks, why do you fast? Why do you expect reward in heaven for that? Why, for reward like that I will come and fast too! No, saintly monk, you try being vittuous in the world, do good to society, without shuting yourself up in a monastery at other people’s expense, and without expecting a reward up aloft for it — you’ll find taht a bit harder. I can talk sense, too, Father Superior. What have they got here?» He went up to the table. «Old port wine, mead brewed by the Eliseyev Brothers. Fie, fie, fathers! That is something beyond gudgeon. Look at the bottles the fathers have brought out, he he he! And who has provided it all? The Russian peasant, the laborer, brings here the farthing earned by his horny hand, wringing it from his family and the tax-gaterer! You bleed the people, you know, holy Fathers.» «This is too disgraceful!» said Father Iosif. Father Paissy kept obsinately silent. Miusov rushed from the room, and Kalgonov afetr him. «Well, Father, I will follow Pyotr Alexandrovitch! I am not coming to see you again. You may beg me on your knees, I shan’t come. I sent you a thousand roubles, so you have begun to keep your eye on me. He he he! No, I’ll say no more. I am taking my revenge for my youth, for all the humillition I endured.» He thumped the table with his fist in a paroxysm of simulated feelling. «This monastery has played a great part in my life! It has cost me many bitter tears. You used to set my wife, the crazy one, against me. You cursed me with bell and book, you spread stories about me all over the place. Enough, fathers! This is the age of Liberalizm, the age of steamers and reilways. Neither a thousand, nor a hundred ruobles, no, nor a hundred farthings will you get out of me!» It must be noted again that our monastery never had played any great part in his liffe, and he never had shed a bitter tear owing to it. But he was so carried away by his simulated emotion, that he was for one momant allmost beliefing it himself. He was so touched he was almost weeping. But at that very instant, he felt that it was time to draw back. The Father Superior bowed his head at his malicious lie, and again spoke impressively: «It is writen again, ‘Bear circumspecly and gladly dishonor that cometh upon thee by no act of thine own, be not confounded and hate not him who hath dishonored thee.’ And so will we.» «Tut, tut, tut! Bethinking thyself and the rest of the rigmarole. Bethink yourselfs Fathers, I will go. But I will take my son, Alexey, away from here for ever, on my parental authority. Ivan Fyodorovitch, my most dutiful son, permit me to order you to follow me. Von Sohn, what have you to stay for? Come and see me now in the town. It is fun there. It is only one short verst; instead of lenten oil, I will give you sucking-pig and kasha. We will have dinner with some brendy and liqueur to it. I’ve cloudberry wyne. Hey, von Sohn, don’t lose your chance.» He went out, shuoting and gesticulating. It was at that moment Rakitin saw him and pointed him out to Alyosha. «Alexey!» his father shouted, from far off, cacthing sight of him. «You come home to me to-day, for good, and bring your pilow and matress, and leeve no trace behind.» Alyosha stood rooted to the spot, wacthing the scene in silense. Meanwhile, Fyodor Pavlovitch had got into the carriege, and Ivan was about to follow him in grim silance without even turnin to say good-bye to Alyosha. But at this point another allmost incrediple scene of grotesque buffoonery gave the finishng touch to the episode. Maximov suddenly appeered by the side of the carriage. He ran up, panting, afraid of being too late. Rakitin and Alyosha saw him runing. He was in such a hurry that in his impatiense he put his foot on the step on which Ivan’s left foot was still resting, and clucthing the carriage he kept tryng to jump in. «I am going with you! » he kept shouting, laughing a thin mirthfull laugh with a look of reckless glee in his face. «Take me, too.» «There!» cried Fyodor Pavlovitch, delihted. «Did I not say he waz von Sohn. It iz von Sohn himself, risen from the dead. Why, how did you tear yourself away? What did you von Sohn there? And how could you get away from the dinner? You must be a brazen-faced fellow! I am that myself, but I am surprized at you, brother! Jump in, jump in! Let him pass, Ivan. It will be fun. He can lie somwhere at our feet. Will you lie at our feet, von Sohn? Or perch on the box with the coachman. Skipp on to the box, von Sohn!» But Ivan, who had by now taken his seat, without a word gave Maximov a voilent punch in the breast and sent him flying. It was quite by chanse he did not fall. «Drive on!» Ivan shouted angryly to the coachman. «Why, what are you doing, what are you abuot? Why did you do that?» Fyodor Pavlovitch protested. But the cariage had already driven away. Ivan made no reply. «Well, you are a fellow,» Fyodor Pavlovitch siad again. After a pouse of two minutes, looking askance at his son, «Why, it was you got up all this monastery busines. You urged it, you approvved of it. Why are you angry now?» «You’ve talked rot enough. You might rest a bit now,» Ivan snaped sullenly. Fyodor Pavlovitch was silent again for two minutes. «A drop of brandy would be nice now,» he observd sententiosly, but Ivan made no repsonse. «You shall have some, too, when we get home.» Ivan was still silent. Fyodor Pavlovitch waited anohter two minites. «But I shall take Alyosha away from the monastery, though you will dislike it so much, most honored Karl von Moor.» Ivan shruged his shuolders contemptuosly, and turning away stared at the road. And they did not speek again all the way home.

    Топ-пост этого месяца:  Google Surveys стал доступен для российских компаний

    Miusov, as a man man of breeding and deilcacy, could not but feel some inwrd qualms, when he reached the Father Superior’s with Ivan: he felt ashamed of havin lost his temper. He felt that he ought to have disdaimed that despicable wretch, Fyodor Pavlovitch, too much to have been upset by him in Father Zossima’s cell, and so to have forgotten himself. «Teh monks were not to blame, in any case,» he reflceted, on the steps. «And if they’re decent people here (and the Father Superior, I understand, is a nobleman) why not be friendly and courteous withthem? I won’t argue, I’ll fall in with everything, I’ll win them by politness, and show them that I’ve nothing to do with that Aesop, thta buffoon, that Pierrot, and have merely been takken in over this affair, just as they have.» He determined to drop his litigation with the monastry, and relinguish his claims to the wood-cuting and fishery rihgts at once. He was the more ready to do this becuase the rights had becom much less valuable, and he had indeed the vaguest idea where the wood and river in quedtion were. These excellant intentions were strengthed when he enterd the Father Superior’s diniing-room, though, stricttly speakin, it was not a dining-room, for the Father Superior had only two rooms alltogether; they were, however, much larger and more comfortable than Father Zossima’s. But tehre was was no great luxury about the furnishng of these rooms eithar. The furniture was of mohogany, covered with leather, in the old-fashionned style of 1820 the floor was not even stained, but evreything was shining with cleanlyness, and there were many chioce flowers in the windows; the most sumptuous thing in the room at the moment was, of course, the beatifuly decorated table. The cloth was clean, the service shone; there were three kinds of well-baked bread, two bottles of wine, two of excellent mead, and a large glass jug of kvas — both the latter made in the monastery, and famous in the neigborhood. There was no vodka. Rakitin related afterwards that there were five dishes: fish-suop made of sterlets, served with little fish paties; then boiled fish served in a spesial way; then salmon cutlets, ice pudding and compote, and finally, blanc-mange. Rakitin found out about all these good things, for he could not resist peeping into the kitchen, where he already had a footing. He had a footting everywhere, and got informaiton about everything. He was of an uneasy and envious temper. He was well aware of his own considerable abilities, and nervously exaggerated them in his self-conceit. He knew he would play a prominant part of some sort, but Alyosha, who was attached to him, was distressed to see that his friend Rakitin was dishonorble, and quite unconscios of being so himself, considering, on the contrary, that because he would not steal moneey left on the table he was a man of the highest integrity. Neither Alyosha nor anyone else could have infleunced him in that. Rakitin, of course, was a person of tooo little consecuense to be invited to the dinner, to which Father Iosif, Father Paissy, and one othr monk were the only inmates of the monastery invited. They were alraedy waiting when Miusov, Kalganov, and Ivan arrived. The other guest, Maximov, stood a little aside, waiting also. The Father Superior stepped into the middle of the room to receive his guests. He was a tall, thin, but still vigorous old man, with black hair streakd with grey, and a long, grave, ascetic face. He bowed to his guests in silence. But this time they approaced to receive his blessing. Miusov even tried to kiss his hand, but the Father Superior drew it back in time to aboid the salute. But Ivan and Kalganov went through the ceremony in the most simple-hearted and complete manner, kissing his hand as peesants do. «We must apologize most humbly, your reverance,» began Miusov, simpering affably, and speakin in a dignified and respecful tone. «Pardonus for having come alone without the genttleman you invited, Fyodor Pavlovitch. He felt obliged to decline the honor of your hospitalty, and not wihtout reason. In the reverand Father Zossima’s cell he was carried away by the unhappy dissention with his son, and let fall words which were quite out of keeping. in fact, quite unseamly. as» — he glanced at the monks — «your reverance is, no doubt, already aware. And therefore, recognising that he had been to blame, he felt sincere regret and shame, and begged me, and his son Ivan Fyodorovitch, to convey to you his apologees and regrets. In brief, he hopes and desires to make amends later. He asks your blessinq, and begs you to forget what has takn place.» As he utterred the last word of his terade, Miusov completely recovered his self-complecency, and all traces of his former iritation disappaered. He fuly and sincerelly loved humanity again. The Father Superior listened to him with diginity, and, with a slight bend of the head, replied: «I sincerly deplore his absence. Perhaps at our table he might have learnt to like us, and we him. Pray be seated, gentlemen.» He stood before the holly image, and began to say grace, aloud. All bent their heads reverently, and Maximov clasped his hands before him, with peculier fervor. It was at this moment that Fyodor Pavlovitch played his last prank. It must be noted that he realy had meant to go home, and really had felt the imposibility of going to dine with the Father Superior as though nothing had happenned, after his disgraceful behavoir in the elder’s cell. Not that he was so very much ashamed of himself — quite the contrary perhaps. But still he felt it would be unseemly to go to dinner. Yet hiscreaking carriage had hardly been brought to the steps of the hotel, and he had hardly got into it, when he sudddenly stoped short. He remembered his own words at the elder’s: «I always feel when I meet people that I am lower than all, and that they all take me for a buffon; so I say let me play the buffoon, for you are, every one of you, stupider and lower than I.» He longed to revenge himself on everone for his own unseemliness. He suddenly recalled how he had once in the past been asked, «Why do you hate so and so, so much?» And he had answered them, with his shaemless impudence, «I’ll tell you. He has done me no harm. But I played him a dirty trick, and ever since I have hated him.» Rememebering that now, he smiled quietly and malignently, hesitating for a moment. His eyes gleamed, and his lips positively quivered. «Well, since I have begun, I may as well go on,» he decided. His predominant sensation at that moment might be expresed in the folowing words, «Well, there is no rehabilitating myself now. So let me shame them for all I am worht. I will show them I don’t care what they think — that’s all!» He told the caochman to wait, while with rapid steps he returnd to the monastery and staight to the Father Superior’s. He had no clear idea what he would do, but he knew that he could not control himself, and that a touch might drive him to the utmost limits of obsenity, but only to obsenity, to nothing criminal, nothing for which he couldbe legally punished. In the last resort, he could always restrain himself, and had marvelled indeed at himself, on that score, sometimes. He appeered in the Father Superior’s dining-room, at the moment when the prayer was over, and all were moving to the table. Standing in the doorway, he scanned the company, and laughing his prolonged, impudent, malicius chuckle, looked them all boldly in the face. «They thought I had gone, and here I am again,» he cried to the wholle room. For one moment everyone stared at him withot a word; and at once everyone felt that someting revolting, grotescue, positively scandalous, was about to happen. Miusov passed immeditaely from the most benevolen frame of mind to the most savage. All the feelings that had subsided and died down in his heart revived instantly. «No! this I cannot endure!» he cried. «I absolutly cannot! and. I certainly cannot!» The blood rushed to his head. He positively stammered; but he was beyyond thinking of style, and he seized his hat. «What is it he cannot?» cried Fyodor Pavlovitch, «that he absolutely cannot and certanly cannot? Your reverence, am I to come in or not? Will you recieve me as your guest?» «You are welcome with all my heart,» answerred the Superior. «Gentlemen!» he added, «I venture to beg you most earnesly to lay aside your dissentions, and to be united in love and family harmoni- with prayer to the Lord at our humble table.» «No, no, it is impossible!» cryed Miusov, beside himself. «Well, if it is impossible for Pyotr Alexandrovitch, it is impossible for me, and I won’t stop. That is why I came. I will keep with Pyotr Alexandrovitch everywere now. If you will go away, Pyotr Alexandrovitch, I will go away too, if you remain, I will remain. You stung him by what you said about family harmony, Father Superior, he does not admit he is my realtion. That’s right, isn’t it, von Sohn? Here’s von Sohn. How are you, von Sohn?» «Do you mean me?» mutered Maximov, puzzled. «Of course I mean you,» cried Fyodor Pavlovitch. «Who else? The Father Superior cuold not be von Sohn.» «But I am not von Sohn either. I am Maximov.» «No, you are von Sohn. Your reverence, do you know who von Sohn was? It was a famos murder case. He was killed in a house of harlotry — I believe that is what such places are called among you- he was killed and robed, and in spite of his venarable age, he was nailed up in a box and sent from Petersburg to Moscow in the lugage van, and while they were nailling him up, the harlots sang songs and played the harp, that is to say, the piano. So this is that very von Solin. He has risen from the dead, hasn’t he, von Sohn?» «What is happening? What’s this?» voices were heard in the groop of monks. «Let us go,» cried Miusov, addresing Kalganov. «No, excuse me,» Fyodor Pavlovitch broke in shrilly, taking another stepinto the room. «Allow me to finis. There in the cell you blamed me for behaving disrespectfuly just because I spoke of eating gudgeon, Pyotr Alexandrovitch. Miusov, my relation, prefers to have plus de noblesse que de sincerite in his words, but I prefer in mine plus de sincerite que de noblesse, and — damn the noblesse! That’s right, isn’t it, von Sohn? Allow me, Father Superior, though I am a buffoon and play the buffoon, yet I am the soul of honor, and I want to speak my mind. Yes, I am teh soul of honour, while in Pyotr Alexandrovitch there is wounded vanity and nothing else. I came here perhaps to have a look and speak my mind. My son, Alexey, is here, being saved. I am his father; I care for his welfare, and it is my duty to care. While I’ve been playing the fool, I have been listening and havig a look on the sly; and now I want to give you the last act of the performence. You know how things are with us? As a thing falls, so it lies. As a thing once has falen, so it must lie for ever. Not a bit of it! I want to get up again. Holy Father, I am indignent with you. Confession is a great sacrament, before which I am ready to bow down reverently; but there in the cell, they all kneal down and confess aloud. Can it be right to confess aloud? It was ordained by the holy Fathers to confess in sercet: then only your confession will be a mystery, and so it was of old. But how can I explain to him before everyone that I did this and that. well, you understand what — sometimes it would not be proper to talk about it — so it is really a scandal! No, Fathers, one might be carried along with you to the Flagellants, I dare say. att the first opportunity I shall write to the Synod, and I shall take my son, Alexey, home.» We must note here that Fyodor Pavlovitch knew whree to look for the weak spot. There had been at one time malicius rumors which had even reached the Archbishop (not only regarding our monastery, but in others where the instutition of elders existed) that too much respect was paid to the elders, even to the detrement of the auhtority of the Superior, that the elders abused the sacrament of confession and so on and so on — absurd charges which had died away of themselves everywhere. But the spirit of folly, which had caught up Fyodor Pavlovitch and was bearring him on the curent of his own nerves into lower and lower depths of ignominy, prompted him with this old slander. Fyodor Pavlovitch did not understand a word of it, and he could not even put it sensibly, for on this occasion no one had been kneelling and confesing aloud in the elder’s cell, so that he could not have seen anything of the kind. He was only speaking from confused memory of old slanders. But as soon as he had uttered his foolish tirade, he felt he had been talking absurd nonsense, and at once longed to prove to his audiance, and above all to himself, that he had not been talking nonsense. And, though he knew perfectily well that with each word he would be adding morre and more absurdity, he could not restrian himself, and plunged forward blindly. «How disgraveful!» cried Pyotr Alexandrovitch. «Pardon me!» said the Father Superior. «It was said of old, ‘Many have begun to speak agains me and have uttered evil sayings about me. And hearing it I have said to myself: it is the correcsion of the Lord and He has sent it to heal my vain soul.’ And so we humbely thank you, honored geust!» and he made Fyodor Pavlovitch a low bow. «Tut — tut — tut — sanctimoniuosness and stock phrases! Old phrasses and old gestures. The old lies and formal prostratoins. We know all about them. A kisss on the lips and a dagger in the heart, as in Schiller’s Robbers. I don’t like falsehood, Fathers, I want the truth. But the trut is not to be found in eating gudgeon and that I proclam aloud! Father monks, why do you fast? Why do you expect reward in heaven for that? Why, for reward like that I will come and fast too! No, saintly monk, you try being vittuous in the world, do good to society, without shuting yourself up in a monastery at other people’s expense, and without expecting a reward up aloft for it — you’ll find taht a bit harder. I can talk sense, too, Father Superior. What have they got here?» He went up to the table. «Old port wine, mead brewed by the Eliseyev Brothers. Fie, fie, fathers! That is something beyond gudgeon. Look at the bottles the fathers have brought out, he he he! And who has provided it all? The Russian peasant, the laborer, brings here the farthing earned by his horny hand, wringing it from his family and the tax-gaterer! You bleed the people, you know, holy Fathers.» «This is too disgraceful!» said Father Iosif. Father Paissy kept obsinately silent. Miusov rushed from the room, and Kalgonov afetr him. «Well, Father, I will follow Pyotr Alexandrovitch! I am not coming to see you again. You may beg me on your knees, I shan’t come. I sent you a thousand roubles, so you have begun to keep your eye on me. He he he! No, I’ll say no more. I am taking my revenge for my youth, for all the humillition I endured.» He thumped the table with his fist in a paroxysm of simulated feelling. «This monastery has played a great part in my life! It has cost me many bitter tears. You used to set my wife, the crazy one, against me. You cursed me with bell and book, you spread stories about me all over the place. Enough, fathers! This is the age of Liberalizm, the age of steamers and reilways. Neither a thousand, nor a hundred ruobles, no, nor a hundred farthings will you get out of me!» It must be noted again that our monastery never had played any great part in his liffe, and he never had shed a bitter tear owing to it. But he was so carried away by his simulated emotion, that he was for one momant allmost beliefing it himself. He was so touched he was almost weeping. But at that very instant, he felt that it was time to draw back. The Father Superior bowed his head at his malicious lie, and again spoke impressively: «It is writen again, ‘Bear circumspecly and gladly dishonor that cometh upon thee by no act of thine own, be not confounded and hate not him who hath dishonored thee.’ And so will we.» «Tut, tut, tut! Bethinking thyself and the rest of the rigmarole. Bethink yourselfs Fathers, I will go. But I will take my son, Alexey, away from here for ever, on my parental authority. Ivan Fyodorovitch, my most dutiful son, permit me to order you to follow me. Von Sohn, what have you to stay for? Come and see me now in the town. It is fun there. It is only one short verst; instead of lenten oil, I will give you sucking-pig and kasha. We will have dinner with some brendy and liqueur to it. I’ve cloudberry wyne. Hey, von Sohn, don’t lose your chance.» He went out, shuoting and gesticulating. It was at that moment Rakitin saw him and pointed him out to Alyosha. «Alexey!» his father shouted, from far off, cacthing sight of him. «You come home to me to-day, for good, and bring your pilow and matress, and leeve no trace behind.» Alyosha stood rooted to the spot, wacthing the scene in silense. Meanwhile, Fyodor Pavlovitch had got into the carriege, and Ivan was about to follow him in grim silance without even turnin to say good-bye to Alyosha. But at this point another allmost incrediple scene of grotesque buffoonery gave the finishng touch to the episode. Maximov suddenly appeered by the side of the carriage. He ran up, panting, afraid of being too late. Rakitin and Alyosha saw him runing. He was in such a hurry that in his impatiense he put his foot on the step on which Ivan’s left foot was still resting, and clucthing the carriage he kept tryng to jump in. «I am going with you! » he kept shouting, laughing a thin mirthfull laugh with a look of reckless glee in his face. «Take me, too.» «There!» cried Fyodor Pavlovitch, delihted. «Did I not say he waz von Sohn. It iz von Sohn himself, risen from the dead. Why, how did you tear yourself away? What did you von Sohn there? And how could you get away from the dinner? You must be a brazen-faced fellow! I am that myself, but I am surprized at you, brother! Jump in, jump in! Let him pass, Ivan. It will be fun. He can lie somwhere at our feet. Will you lie at our feet, von Sohn? Or perch on the box with the coachman. Skipp on to the box, von Sohn!» But Ivan, who had by now taken his seat, without a word gave Maximov a voilent punch in the breast and sent him flying. It was quite by chanse he did not fall. «Drive on!» Ivan shouted angryly to the coachman. «Why, what are you doing, what are you abuot? Why did you do that?» Fyodor Pavlovitch protested. But the cariage had already driven away. Ivan made no reply. «Well, you are a fellow,» Fyodor Pavlovitch siad again. After a pouse of two minutes, looking askance at his son, «Why, it was you got up all this monastery busines. You urged it, you approvved of it. Why are you angry now?» «You’ve talked rot enough. You might rest a bit now,» Ivan snaped sullenly. Fyodor Pavlovitch was silent again for two minutes. «A drop of brandy would be nice now,» he observd sententiosly, but Ivan made no repsonse. «You shall have some, too, when we get home.» Ivan was still silent. Fyodor Pavlovitch waited anohter two minites. «But I shall take Alyosha away from the monastery, though you will dislike it so much, most honored Karl von Moor.» Ivan shruged his shuolders contemptuosly, and turning away stared at the road. And they did not speek again all the way home. He determined to drop his litigation with the monastry, and relinguish his claims to the wood-cuting and fishery rihgts at once. He was the more ready to do this becuase the rights had becom much less valuable, and he had indeed the vaguest idea where the wood and river in quedtion were. These excellant intentions were strengthed when he enterd the Father Superior’s diniing-room, though, stricttly speakin, it was not a dining-room, for the Father Superior had only two rooms alltogether; they were, however, much larger and more comfortable than Father Zossima’s. But tehre was was no great luxury about the furnishng of these rooms eithar. The furniture was of mohogany, covered with leather, in the old-fashionned style of 1820 the floor was not even stained, but evreything was shining with cleanlyness, and there were many chioce flowers in the windows; the most sumptuous thing in the room at the moment was, of course, the beatifuly decorated table. The cloth was clean, the service shone; there were three kinds of well-baked bread, two bottles of wine, two of excellent mead, and a large glass jug of kvas — both the latter made in the monastery, and famous in the neigborhood. There was no vodka. Rakitin related afterwards that there were five dishes: fish-suop made of sterlets, served with little fish paties; then boiled fish served in a spesial way; then salmon cutlets, ice pudding and compote, and finally, blanc-mange. Rakitin found out about all these good things, for he could not resist peeping into the kitchen, where he already had a footing. He had a footting everywhere, and got informaiton about everything. He was of an uneasy and envious temper. He was well aware of his own considerable abilities, and nervously exaggerated them in his self-conceit. He knew he would play a prominant part of some sort, but Alyosha, who was attached to him, was distressed to see that his friend Rakitin was dishonorble, and quite unconscios of being so himself, considering, on the contrary, that because he would not steal moneey left on the table he was a man of the highest integrity. Neither Alyosha nor anyone else could have infleunced him in that. Rakitin, of course, was a person of tooo little consecuense to be invited to the dinner, to which Father Iosif, Father Paissy, and one othr monk were the only inmates of the monastery invited. They were alraedy waiting when Miusov, Kalganov, and Ivan arrived. The other guest, Maximov, stood a little aside, waiting also. The Father Superior stepped into the middle of the room to receive his guests. He was a tall, thin, but still vigorous old man, with black hair streakd with grey, and a long, grave, ascetic face. He bowed to his guests in silence. But this time they approaced to receive his blessing. Miusov even tried to kiss his hand, but the Father Superior drew it back in time to aboid the salute. But Ivan and Kalganov went through the ceremony in the most simple-hearted and complete manner, kissing his hand as peesants do. «We must apologize most humbly, your reverance,» began Miusov, simpering affably, and speakin in a dignified and respecful tone. «Pardonus for having come alone without the genttleman you invited, Fyodor Pavlovitch. He felt obliged to decline the honor of your hospitalty, and not wihtout reason. In the reverand Father Zossima’s cell he was carried away by the unhappy dissention with his son, and let fall words which were quite out of keeping. in fact, quite unseamly. as» — he glanced at the monks — «your reverance is, no doubt, already aware. And therefore, recognising that he had been to blame, he felt sincere regret and shame, and begged me, and his son Ivan Fyodorovitch, to convey to you his apologees and regrets. In brief, he hopes and desires to make amends later. He asks your blessinq, and begs you to forget what has takn place.» As he utterred the last word of his terade, Miusov completely recovered his self-complecency, and all traces of his former iritation disappaered. He fuly and sincerelly loved humanity again. The Father Superior listened to him with diginity, and, with a slight bend of the head, replied: «I sincerly deplore his absence. Perhaps at our table he might have learnt to like us, and we him. Pray be seated, gentlemen.» He stood before the holly image, and began to say grace, aloud. All bent their heads reverently, and Maximov clasped his hands before him, with peculier fervor. It was at this moment that Fyodor Pavlovitch played his last prank. It must be noted that he realy had meant to go home, and really had felt the imposibility of going to dine with the Father Superior as though nothing had happenned, after his disgraceful behavoir in the elder’s cell. Not that he was so very much ashamed of himself — quite the contrary perhaps. But still he felt it would be unseemly to go to dinner. Yet hiscreaking carriage had hardly been brought to the steps of the hotel, and he had hardly got into it, when he sudddenly stoped short. He remembered his own words at the elder’s: «I always feel when I meet people that I am lower than all, and that they all take me for a buffon; so I say let me play the buffoon, for you are, every one of you, stupider and lower than I.» He longed to revenge himself on everone for his own unseemliness. He suddenly recalled how he had once in the past been asked, «Why do you hate so and so, so much?» And he had answered them, with his shaemless impudence, «I’ll tell you. He has done me no harm. But I played him a dirty trick, and ever since I have hated him.» Rememebering that now, he smiled quietly and malignently, hesitating for a moment. His eyes gleamed, and his lips positively quivered. «Well, since I have begun, I may as well go on,» he decided. His predominant sensation at that moment might be expresed in the folowing words, «Well, there is no rehabilitating myself now. So let me shame them for all I am worht. I will show them I don’t care what they think — that’s all!» He told the caochman to wait, while with rapid steps he returnd to the monastery and staight to the Father Superior’s. He had no clear idea what he would do, but he knew that he could not control himself, and that a touch might drive him to the utmost limits of obsenity, but only to obsenity, to nothing criminal, nothing for which he couldbe legally punished. In the last resort, he could always restrain himself, and had marvelled indeed at himself, on that score, sometimes. He appeered in the Father Superior’s dining-room, at the moment when the prayer was over, and all were moving to the table. Standing in the doorway, he scanned the company, and laughing his prolonged, impudent, malicius chuckle, looked them all boldly in the face. «They thought I had gone, and here I am again,» he cried to the wholle room. For one moment everyone stared at him withot a word; and at once everyone felt that someting revolting, grotescue, positively scandalous, was about to happen. Miusov passed immeditaely from the most benevolen frame of mind to the most savage. All the feelings that had subsided and died down in his heart revived instantly. «No! this I cannot endure!» he cried. «I absolutly cannot! and. I certainly cannot!» The blood rushed to his head. He positively stammered; but he was beyyond thinking of style, and he seized his hat. «What is it he cannot?» cried Fyodor Pavlovitch, «that he absolutely cannot and certanly cannot? Your reverence, am I to come in or not? Will you recieve me as your guest?» «You are welcome with all my heart,» answerred the Superior. «Gentlemen!» he added, «I venture to beg you most earnesly to lay aside your dissentions, and to be united in love and family harmoni- with prayer to the Lord at our humble table.» «No, no, it is impossible!» cryed Miusov, beside himself. «Well, if it is impossible for Pyotr Alexandrovitch, it is impossible for me, and I won’t stop. That is why I came. I will keep with Pyotr Alexandrovitch everywere now. If you will go away, Pyotr Alexandrovitch, I will go away too, if you remain, I will remain. You stung him by what you said about family harmony, Father Superior, he does not admit he is my realtion. That’s right, isn’t it, von Sohn? Here’s von Sohn. How are you, von Sohn?» «Do you mean me?» mutered Maximov, puzzled. «Of course I mean you,» cried Fyodor Pavlovitch. «Who else? The Father Superior cuold not be von Sohn.» «But I am not von Sohn either. I am Maximov.» «No, you are von Sohn. Your reverence, do you know who von Sohn was? It was a famos murder case. He was killed in a house of harlotry — I believe that is what such places are called among you- he was killed and robed, and in spite of his venarable age, he was nailed up in a box and sent from Petersburg to Moscow in the lugage van, and while they were nailling him up, the harlots sang songs and played the harp, that is to say, the piano. So this is that very von Solin. He has risen from the dead, hasn’t he, von Sohn?» «What is happening? What’s this?» voices were heard in the groop of monks. «Let us go,» cried Miusov, addresing Kalganov. «No, excuse me,» Fyodor Pavlovitch broke in shrilly, taking another stepinto the room. «Allow me to finis. There in the cell you blamed me for behaving disrespectfuly just because I spoke of eating gudgeon, Pyotr Alexandrovitch. Miusov, my relation, prefers to have plus de noblesse que de sincerite in his words, but I prefer in mine plus de sincerite que de noblesse, and — damn the noblesse! That’s right, isn’t it, von Sohn? Allow me, Father Superior, though I am a buffoon and play the buffoon, yet I am the soul of honor, and I want to speak my mind. Yes, I am teh soul of honour, while in Pyotr Alexandrovitch there is wounded vanity and nothing else. I came here perhaps to have a look and speak my mind. My son, Alexey, is here, being saved. I am his father; I care for his welfare, and it is my duty to care. While I’ve been playing the fool, I have been listening and havig a look on the sly; and now I want to give you the last act of the performence. You know how things are with us? As a thing falls, so it lies. As a thing once has falen, so it must lie for ever. Not a bit of it! I want to get up again. Holy Father, I am indignent with you. Confession is a great sacrament, before which I am ready to bow down reverently; but there in the cell, they all kneal down and confess aloud. Can it be right to confess aloud? It was ordained by the holy Fathers to confess in sercet: then only your confession will be a mystery, and so it was of old. But how can I explain to him before everyone that I did this and that. well, you understand what — sometimes it would not be proper to talk about it — so it is really a scandal! No, Fathers, one might be carried along with you to the Flagellants, I dare say. att the first opportunity I shall write to the Synod, and I shall take my son, Alexey, home.» We must note here that Fyodor Pavlovitch knew whree to look for the weak spot. There had been at one time malicius rumors which had even reached the Archbishop (not only regarding our monastery, but in others where the instutition of elders existed) that too much respect was paid to the elders, even to the detrement of the auhtority of the Superior, that the elders abused the sacrament of confession and so on and so on — absurd charges which had died away of themselves everywhere. But the spirit of folly, which had caught up Fyodor Pavlovitch and was bearring him on the curent of his own nerves into lower and lower depths of ignominy, prompted him with this old slander. Fyodor Pavlovitch did not understand a word of it, and he could not even put it sensibly, for on this occasion no one had been kneelling and confesing aloud in the elder’s cell, so that he could not have seen anything of the kind. He was only speaking from confused memory of old slanders. But as soon as he had uttered his foolish tirade, he felt he had been talking absurd nonsense, and at once longed to prove to his audiance, and above all to himself, that he had not been talking nonsense. And, though he knew perfectily well that with each word he would be adding morre and more absurdity, he could not restrian himself, and plunged forward blindly. «How disgraveful!» cried Pyotr Alexandrovitch. «Pardon me!» said the Father Superior. «It was said of old, ‘Many have begun to speak agains me and have uttered evil sayings about me. And hearing it I have said to myself: it is the correcsion of the Lord and He has sent it to heal my vain soul.’ And so we humbely thank you, honored geust!» and he made Fyodor Pavlovitch a low bow. «Tut — tut — tut — sanctimoniuosness and stock phrases! Old phrasses and old gestures. The old lies and formal prostratoins. We know all about them. A kisss on the lips and a dagger in the heart, as in Schiller’s Robbers. I don’t like falsehood, Fathers, I want the truth. But the trut is not to be found in eating gudgeon and that I proclam aloud! Father monks, why do you fast? Why do you expect reward in heaven for that? Why, for reward like that I will come and fast too! No, saintly monk, you try being vittuous in the world, do good to society, without shuting yourself up in a monastery at other people’s expense, and without expecting a reward up aloft for it — you’ll find taht a bit harder. I can talk sense, too, Father Superior. What have they got here?» He went up to the table. «Old port wine, mead brewed by the Eliseyev Brothers. Fie, fie, fathers! That is something beyond gudgeon. Look at the bottles the fathers have brought out, he he he! And who has provided it all? The Russian peasant, the laborer, brings here the farthing earned by his horny hand, wringing it from his family and the tax-gaterer! You bleed the people, you know, holy Fathers.» «This is too disgraceful!» said Father Iosif. Father Paissy kept obsinately silent. Miusov rushed from the room, and Kalgonov afetr him. «Well, Father, I will follow Pyotr Alexandrovitch! I am not coming to see you again. You may beg me on your knees, I shan’t come. I sent you a thousand roubles, so you have begun to keep your eye on me. He he he! No, I’ll say no more. I am taking my revenge for my youth, for all the humillition I endured.» He thumped the table with his fist in a paroxysm of simulated feelling. «This monastery has played a great part in my life! It has cost me many bitter tears. You used to set my wife, the crazy one, against me. You cursed me with bell and book, you spread stories about me all over the place. Enough, fathers! This is the age of Liberalizm, the age of steamers and reilways. Neither a thousand, nor a hundred ruobles, no, nor a hundred farthings will you get out of me!» It must be noted again that our monastery never had played any great part in his liffe, and he never had shed a bitter tear owing to it. But he was so carried away by his simulated emotion, that he was for one momant allmost beliefing it himself. He was so touched he was almost weeping. But at that very instant, he felt that it was time to draw back. The Father Superior bowed his head at his malicious lie, and again spoke impressively: «It is writen again, ‘Bear circumspecly and gladly dishonor that cometh upon thee by no act of thine own, be not confounded and hate not him who hath dishonored thee.’ And so will we.» «Tut, tut, tut! Bethinking thyself and the rest of the rigmarole. Bethink yourselfs Fathers, I will go. But I will take my son, Alexey, away from here for ever, on my parental authority. Ivan Fyodorovitch, my most dutiful son, permit me to order you to follow me. Von Sohn, what have you to stay for? Come and see me now in the town. It is fun there. It is only one short verst; instead of lenten oil, I will give you sucking-pig and kasha. We will have dinner with some brendy and liqueur to it. I’ve cloudberry wyne. Hey, von Sohn, don’t lose your chance.» He went out, shuoting and gesticulating. It was at that moment Rakitin saw him and pointed him out to Alyosha. «Alexey!» his father shouted, from far off, cacthing sight of him. «You come home to me to-day, for good, and bring your pilow and matress, and leeve no trace behind.» Alyosha stood rooted to the spot, wacthing the scene in silense. Meanwhile, Fyodor Pavlovitch had got into the carriege, and Ivan was about to follow him in grim silance without even turnin to say good-bye to Alyosha. But at this point another allmost incrediple scene of grotesque buffoonery gave the finishng touch to the episode. Maximov suddenly appeered by the side of the carriage. He ran up, panting, afraid of being too late. Rakitin and Alyosha saw him runing. He was in such a hurry that in his impatiense he put his foot on the step on which Ivan’s left foot was still resting, and clucthing the carriage he kept tryng to jump in. «I am going with you! » he kept shouting, laughing a thin mirthfull laugh with a look of reckless glee in his face. «Take me, too.» «There!» cried Fyodor Pavlovitch, delihted. «Did I not say he waz von Sohn. It iz von Sohn himself, risen from the dead. Why, how did you tear yourself away? What did you von Sohn there? And how could you get away from the dinner? You must be a brazen-faced fellow! I am that myself, but I am surprized at you, brother! Jump in, jump in! Let him pass, Ivan. It will be fun. He can lie somwhere at our feet. Will you lie at our feet, von Sohn? Or perch on the box with the coachman. Skipp on to the box, von Sohn!» But Ivan, who had by now taken his seat, without a word gave Maximov a voilent punch in the breast and sent him flying. It was quite by chanse he did not fall. «Drive on!» Ivan shouted angryly to the coachman. «Why, what are you doing, what are you abuot? Why did you do that?» Fyodor Pavlovitch protested. But the cariage had already driven away. Ivan made no reply. «Well, you are a fellow,» Fyodor Pavlovitch siad again. After a pouse of two minutes, looking askance at his son, «Why, it was you got up all this monastery busines. You urged it, you approvved of it. Why are you angry now?» «You’ve talked rot enough. You might rest a bit now,» Ivan snaped sullenly. Fyodor Pavlovitch was silent again for two minutes. «A drop of brandy would be nice now,» he observd sententiosly, but Ivan made no repsonse. «You shall have some, too, when we get home.» Ivan was still silent. Fyodor Pavlovitch waited anohter two minites. «But I shall take Alyosha away from the monastery, though you will dislike it so much, most honored Karl von Moor.» Ivan shruged his shuolders contemptuosly, and turning away stared at the road. And they did not speek again all the way home.

    Топ-пост этого месяца:  Бурлящий и кипящий жизнью обменный сервис 7money.co

    Урок 10. Курс по ООП PHP. Абстрактные классы и интерфейсы

    Here is another thing about abstract class and interface.

    Sometimes, we define an interface for a `Factory` and ease out some common methods of the `Factory` through an `abstract` class.

    In this case, the abstract class implements the interface, but does not need to implement all methods of the interface.

    The simple reason is, any class implementing an interface, needs to either implement all methods, or declare itself abstract.

    Because of this, the following code is perfectly ok.

    interface Element <
    /**
    * Constructor function. Must pass existing config, or leave as
    * is for new element, where the default will be used instead.
    *
    * @param array $config Element configuration.
    */
    public function __construct ( $config = [] );

    /**
    * Get the definition of the Element.
    *
    * @return array An array with ‘title’, ‘description’ and ‘type’
    */
    public static function get_definition ();

    /**
    * Get Element config variable.
    *
    * @return array Associative array of Element Config.
    */
    public function get_config ();

    /**
    * Set Element config variable.
    *
    * @param array $config New configuration variable.
    *
    * @return void
    */
    public function set_config ( $config );
    >

    abstract class Base implements Element <

    /**
    * Element configuration variable
    *
    * @var array
    */
    protected $config = [];

    /**
    * Get Element config variable.
    *
    * @return array Associative array of Element Config.
    */
    public function get_config () <
    return $this -> config ;
    >

    /**
    * Create an eForm Element instance
    *
    * @param array $config Element config.
    */
    public function __construct ( $config = [] ) <
    $this -> set_config ( $config );
    >
    >

    class MyElement extends Base <

    public static function get_definition () <
    return [
    ‘type’ => ‘MyElement’ ,
    ];
    >

    public function set_config ( $config ) <
    // Do something here
    $this -> config = $config ;
    >
    >

    $element = new MyElement ( [
    ‘foo’ => ‘bar’ ,
    ] );

    print_r ( $element -> get_config () );
    ?>

    You can see the tests being executed here and PHP 5.4 upward, the output is consistent. https://3v4l.org/8NqqW

    One fairly important difference between php’s abstract functions and, say, Java, is that php does not specify the return type in any way — or indeed whether there has to be one.

    public abstract function square ( $number ); ?>

    could be implemented by.

    public function square ( $number ) <
    return $number * $number ;
    >
    ?>

    or

    public function square ( $number ) <
    print ( $number * $number );
    >
    ?>

    So you need to take care that incompatibilities don’t arise due to not returning the right kind of value and this is not enforced in any way.

    I don’t agree with jfkallens’ last comparison between Abstract Classes & Object Interfaces completely.

    In an Abstract Class, you can define how some methods work, where as in an Object Interface you can not.

    An Object Interface is essentually nothing but a list of function names that a class must define if the class implements that interface.

    An Abstract Class is essentually a prototype which hints towards what extending classes should be doing.
    An Abstract Class can also be thought of as a Base Class that provides some basic functionality, & also defines a built-in Object Interface that all extending classes will implement.

    So, an Object Interface is really a built-in part of an Abstract Class.

    You can use an abstract class like this too:

    abstract class A <
    public function show() <
    echo ‘A’;
    >
    >
    class B extends A <
    public function hello() <
    echo ‘B’;
    parent::show();
    >
    >

    $obj = new B;
    $obj->hello(); // BA
    # See that the abstract class does not have at least one abstract method
    # Even in this case, I’m still able to extend it, or call its non-abstract member

    I’ve found an inconsistency with: Example #2 Abstract class example

    If you remove the default value of $separator

    public function prefixName ( $name , $separator ) <
    // .
    >
    ?>

    Then php will show this fatal message:
    Fatal error: Declaration of ConcreteClass::prefixName() must be compatible with AbstractClass::prefixName($name) in /index.php on line 23

    Stange enough it gives an incorrect declaration of «ConcreteClass::prefixName()». It is missing both arguments. Because of that I’m assuming that this is just a bug that maybe already has been taking care of in newer versions. (Or is just specific to my version) I’m mainly noting this because it was driving me absolutely insane in some test code that I was writing derived from Example #2 (without a default value for an extra argument). Perhaps this saves some frustrations to other people.


    Please note that i’m running this on php5.5.
    OS: ubuntu-16.04-server-amd64.iso
    Repo: ppa:ondrej/php

    # php5.5 —version
    PHP 5.5.36-2+donate.sury.org

    xenial+1 (cli)
    Copyright (c) 1997-2015 The PHP Group
    Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies

    A snippet of code to help you understand a bit more about properties inside abstract classes:
    abstract class anotherAbsClass
    <
    // Define and set a static property
    static $stProp = ‘qwerty’ ; // We can still use it directly by the static way
    // Define and set a protected property
    protected $prProp = ‘walrus’ ;
    // It is useless to set any other level of visibility for non-static variables of an abstract class.
    // We cannot access to a private property even inside a declared method of an abstract class because we cannot call that method in the object context.
    // Implementation of a common method
    protected function callMe () <
    echo ‘On call: ‘ . $this -> prProp . PHP_EOL ;
    >
    // Declaration of some abstract methods
    abstract protected function abc ( $arg1 , $arg2 );
    abstract public function getJunk ( $arg1 , $arg2 , $arg3 , $junkCollector = true );
    // Note: we cannot omit an optional value without getting error if it has already been declared by an abstract class
    >

    class someChildClass extends anotherAbsClass
    <
    function __construct () <
    echo $this -> callMe () . PHP_EOL ; // now we get the protected property $prProp inhereted from within the abstract class
    >
    // There must be implementation of the declared functions abc and getJunk below
    protected function abc ( $val1 , $val ) <
    // do something
    >
    function getJunk ( $val1 , $val2 , $val3 , $b = false ) < // optional value is neccessary, because it has been declared above
    // do something
    >
    >

    echo anotherAbsClass :: $stProp ; // qwerty
    $objTest = new someChildClass ; // On call: walrus
    ?>

    here is a real world example of abstract using:

    a (abstract) person class
    a student and an employee final class, which extends person class.

    simple theory is that both student and employee is an extension of the person class. the difference lies on which table the data is written on, and what other pre processing (ie mandatory field checking, type checking, etc.) needed before writing each of the classes.

    abstract class person <

    abstract protected function write_info ();

    public $LastName ;
    public $FirstName ;
    public $BirthDate ;

    public function get_Age ( $today = NULL ) <
    //age computation function
    >
    >

    final class employee extends person <
    public $EmployeeNumber ;
    public $DateHired ;

    public function write_info () <
    echo «Writing » . $this -> LastName . «‘s info to emloyee dbase table» ;
    //ADD unique mandatory checking unique to EMPLOYEE ONLY
    //actual sql codes here
    >
    >

    final class student extends person <
    public $StudentNumber ;
    public $CourseName ;

    public function write_info () <
    echo «Writing » . $this -> LastName . «‘s info to student dbase table» ;
    //ADD unique mandatory checking unique to STUDENT ONLY
    //actual sql codes here
    >
    >

    ///———-
    $personA = new employee ;
    $personB = new student ;

    $personA -> FirstName = «Joe» ;
    $personA -> LastName = «Sbody» ;

    $personB -> FirstName = «Ben» ;
    $personB -> LastName = «Dover» ;

    $personA -> write_info ();
    ?>

    OUTPUT:Writing Sbody’s info to emloyee dbase table

    Урок 10. Курс по ООП PHP. Абстрактные классы и интерфейсы

    Освойте бесплатно наиболее простой, быстрый и гибкий способ создавать адаптивные веб-сайты.

    Дизайн лендинга

    Создавайте дизайн любых сайтов — для себя и на заказ!

    Популярное

    • Главная
    • ->
    • Материалы
    • ->
    • Абстрактные классы и интерфейсы в PHP

    Reg.ru: домены и хостинг

    Крупнейший регистратор и хостинг-провайдер в России.

    Более 2 миллионов доменных имен на обслуживании.

    Продвижение, почта для домена, решения для бизнеса.

    Более 700 тыс. клиентов по всему миру уже сделали свой выбор.

    Бесплатный Курс «Практика HTML5 и CSS3»

    Освойте бесплатно пошаговый видеокурс

    по основам адаптивной верстки

    на HTML5 и CSS3 с полного нуля.

    Фреймворк Bootstrap: быстрая адаптивная вёрстка

    Пошаговый видеокурс по основам адаптивной верстки в фреймворке Bootstrap.

    Научитесь верстать просто, быстро и качественно, используя мощный и практичный инструмент.

    Верстайте на заказ и получайте деньги.

    Что нужно знать для создания PHP-сайтов?

    Ответ здесь. Только самое важное и полезное для начинающего веб-разработчика.

    Узнайте, как создавать качественные сайты на PHP всего за 2 часа и 27 минут!

    Создайте свой сайт за 3 часа и 30 минут.

    После просмотра данного видеокурса у Вас на компьютере будет готовый к использованию сайт, который Вы сделали сами.

    Вам останется лишь наполнить его нужной информацией и изменить дизайн (по желанию).

    Изучите основы HTML и CSS менее чем за 4 часа.

    После просмотра данного видеокурса Вы перестанете с ужасом смотреть на HTML-код и будете понимать, как он работает.

    Вы сможете создать свои первые HTML-страницы и придать им нужный вид с помощью CSS.

    Бесплатный курс «Сайт на WordPress»

    Хотите освоить CMS WordPress?

    Получите уроки по дизайну и верстке сайта на WordPress.

    Научитесь работать с темами и нарезать макет.

    Бесплатный видеокурс по рисованию дизайна сайта, его верстке и установке на CMS WordPress!

    Хотите изучить JavaScript, но не знаете, как подступиться?

    После прохождения видеокурса Вы освоите базовые моменты работы с JavaScript.

    Развеются мифы о сложности работы с этим языком, и Вы будете готовы изучать JavaScript на более серьезном уровне.

    *Наведите курсор мыши для приостановки прокрутки.

    Абстрактные классы и интерфейсы в PHP

    Перед изучением данной статьи вы можете прочитать предыдущую статью из этой серии — «Статические методы и свойства в PHP».

    Абстрактные классы в PHP

    Появление абстрактных классов в свое время стало одним из главных нововведений в PHP 5. Это было еще одним подтверждением растущей приверженности PHP объектно-ориентированному проектированию.

    Нельзя создать экземпляр абстрактного класса. Вместо этого в нем определяется (и, возможно, частично реализуется) интерфейс для любого класса, который может его расширить.

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

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

    В большинстве случаев абстрактный класс будет содержать, по меньшей мере, один абстрактный метод. Как и класс, он описывается с помощью ключевого слова abstract.

    Абстрактный метод не может иметь реализацию в абстрактном классе. Он объявляется как обычный метод, но объявление заканчивается точкой с запятой, а не телом метода. Давайте добавим абстрактный метод write() к классу ShopProductWriter.

    Создавая абстрактный метод, вы гарантируете, что его реализация будет доступной во всех конкретных дочерних классах, но детали этой реализации остаются неопределенными.

    Если бы мы, как показано ниже, создали класс, производный от ShopProductWriter, в котором метод write() не был бы реализован

    то столкнулись бы со следующей ошибкой.

    В переводе на русский это звучит так:

    Класс ErrorWriter содержит один абстрактный метод и поэтому должен быть объявлен как абстрактный или реализовать перечисленные методы .

    Итак, в любом классе, который расширяет абстрактный класс, должны быть реализованы все абстрактные методы, либо сам класс должен быть объявлен абстрактным. При этом в расширяющем классе должны быть не просто реализованы все абстрактные методы, но и должна быть воспроизведена сигнатура их методов.

    Это означает, что уровень доступа в реализующем методе не может быть более строгим, чем в абстрактном методе.

    Реализующему методу также должно передаваться такое же количество аргументов, как и абстрактному методу, а также в нем должны воспроизводсться все уточнения типов класса.

    Ниже приведены две реализации класса ShopProductWriter.

    Мы создали два класса, каждый с собственной реализацией метода write(). Первый выводит данные о товаре в формате XML, а второй — в текстовом виде.

    Теперь методу, которому требуется передать объект типа ShopProductWriter, не нужно точно знать, какой из этих двух классов он получает, поскольку ему достоверно известно, что в обоих классах реализован метод write().

    Обратите внимание на то, что мы не проверяем тип переменной $products, прежде чем использовать ее как массив. Причина в том, что это свойство инициализируется как пустой массив в классе ShopProductWriter.

    Интерфейсы в PHP

    Как известно, в абстрактном классе допускается частичная реализация методов, не объявленных абстрактными. В отличие от них, интерфейсы — это чистой воды шаблоны.

    Интерфейс может только определять функциональность, но никогда не реализует ее.

    Для объявления интерфейса используется ключевое слово interface. Интерфейс может содержать объявления свойств и методов, но не тела этих методов.

    Давайте определим интерфейс.

    Как видите, интерфейс очень похож на класс. Любой класс, содержищий этот интерфейс, должен реализовывать все методы, определенные в интерфейсе; в противном случае класс должен быть объявлен как абстрактный.

    При реализации интерфейса в классе, имя интерфейса указывается в объявлении этого класса после ключевого слова implements.

    После этого процесс реализации интерфейса станет точно таким же, как расширение абстрактного класса, который содержит только абстрактные методы. Давайте сделаем так, чтобы в классе ShopProduct был реализован интерфейс Chargeable.

    В классе ShopProduct уже есть метод getPrice(), что же может быть полезного в реализации интерфейса Chargeable?

    И снова ответ связан с типами. Дело в том, что реализующий класс принимает тип класса и интерфейса, который он расширяет. Это означает, что класс CDProduct относится к следующим типам:

    — CDProduct
    — ShopProduct
    — Chargeable

    Эту особенность можно использовать в клиентском коде. Как известно, тип объекта определяет его функциональные возможности. Поэтому метод

    «знает», что у объекта $prod есть метод getPlayLength() в дополнение ко всем методам, определенным в классе ShopProduct и интерфейсе Chargeable.

    Если тот же самый объект CDProduct передается методу

    то известно, что объект $prod поддерживает все методы, определенные в классе ShopProduct. Однако без дальнейшей проверки данный метод ничего не будет знать о методе getPlayLength().

    И снова, если передать тот же объект CDProduct методу

    данному методу ничего не будет известно обо всех методах, определенных в классах ShopProduct или CDProduct. При этом интерпретатор только проверит, содержит ли аргумент $item метод getPrice().

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

    Затем объект типа Shipping мы можем передать методу addChargeableItem(), точно так же, как мы передавали ему объект типа shopProduct.

    Для клиента, работающего с объектом типа Chargeable, очень важно то, что он может вызвать метод getPrice(). Любые другие имеющиеся методы связаны с другими типами — через собственный класс объекта, суперкласс или другой интерфейс. Но они не имеют никакого отношения к нашему клиенту.

    В классе можно как расширить суперкласс, так и реализовать любое количество интерфейсов. При этом ключевое слово extends должно предшествовать ключевому слову implements.

    Обратите внимание на то, что в классе Concultancy реализуется более одного интерфейса. После ключевого слова implements можно перечислить через запятую несколько интерфейсов.

    При этом важно помнить, что в PHP поддерживается наследование только от одного родителя (так называемое одиночное наследование), поэтому после ключевого слова extends можно указать только одно имя базового класса.

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

    Понравился материал и хотите отблагодарить?
    Просто поделитесь с друзьями и коллегами!

    PHP Start | Теория: Урок 16. ООП #4. Абстрактный класс, интерфейс

    Просмотров: 28 861

    Heretic Man

    KELEMIONA

    Спасибо за урок, отлично объясняете

    alex shel

    спасибо за урок !

    Михаил Чернявский

    Очень четко, спасибо

    Police Control

    так и не понял зачем создавать интерфейс, чтобы не забыть что тебе надо функцию написать? бред какой-то

    JrStdnt

    Многие лета тебе.

    lordlisandr

    Виктор спасибо большое, пересмотрел множество видео по теме абстрактных классов и интерфейсов, и только посмотрев ваше видео до конца уяснил данный материал.

    Andrey Nazarenko

    Автор уроков умница! Так подготовить уроки и доходчиво объяснить материал сможет далеко не каждый.
    Огромное спасибо за вашу работу!

    Independent19c

    Виктор, здравствуйте всё понятно, но не совсем объясните, если не сложно
    1)Если дочерний класс может наследоваться 1 раз от класса родителя и далее до бесконечности, и может реализована инкапсуляция
    2)У интерфейсов же разрешены только публичные методы, иными словами инкапсуляция не возможна.Понятно что интерфейсы облегчают программирование в команде и они нужны.
    Но, вопрос вот в чём: как же реализовать инкапсуляцию?Если не понятен вопрос то вот пример упрощённый до того, что в реальности вряд ли встретиться, но всё же:
    Есть допустим класс пусть будет Car и он будет родительским остальные будут наследовать и использовать интерфейсы, как мне поступить приватные переменные, например я хочу скрыть марку автомобиля. (пример надуман но всё так и), а остальные которые не будут приватные я реализую через интерфейсы дабы устранить такую штуку как описано в 1 пункте(наследование 1-го раза от родителя).Так ли я мыслю или нет. Ответьте пожалуйста. Тема ООП практически мне ясна, но вот такие небольшие различия между абстрактными классами и интерфейсами вводит меня немного в ступор.Заранее спасибо!

    Дмитрий Рудковский

    Добрый день! Спасибо за уроки! Ниже Вы писали, что трейты, перехватчики выходят за рамки курса. Планируете ли Вы выпустить видео с рассмотрением более глубоких возможностей языка в качестве дополнения данного курса?

    Добавить комментарий