Еще немного терминов

В языках, подобных С++, существует понятие абстрактного класса. Такому классу
разрешается наследовать, но создать его экземпляр невозможно. В более динамичном языке Ruby такого понятия нет, но если программист пожелает, то может смоделировать его, потребовав, чтобы все методы были переопределены в производных классах. Полезно это или нет, оставляем на усмотрение читателя.
Создатель языка С++ Бьерн Страуструп определяет также понятие конкретного
типа. Это класс, существующий только для удобства. Он спроектирован не для
наследования; более того, ожидается, что ему никто никогда наследовать не будет.
Другими словами, преимущества ООП в этом случае сводятся только к инкапсуляции.
Ruby не поддерживает такой конструкции синтаксически (как и С++), но
по природе своей прекрасно приспособлен для создания подобных классов.
Считается, что некоторые языки поддерживают более «чистую» модель ООП,
чем другие. (К ним мы применяем термин «радикально объектно-ориентированный
».) Это означает, что любая сущность в языке является объектом, даже примитивные типы представлены полноценными классами, а переменные и константы рассматриваются как экземпляры. В таких языках, как Java, С++ и Eiffel, дело обстоит иначе. В них примитивные типы (особенно константы) не являются настоящими объектами, хотя иногда могут рассматриваться как таковые с помощью «классов-оберток». Вероятно, есть языки, которые более радикально объектно ориентированы, чем Ruby, но их немного.
Большинство объектно-ориентированных языков статично; методы и атрибуты,
принадлежащие классу, глобальные переменные и иерархия наследования
определяются во время компиляции. Быть может, самый сложный концептуальный
переход заключается в том, что в Ruby все это происходит динамически. И
определения, и даже порядок наследования можно задавать во время исполнения.
Честно говоря, каждое объявление или определение исполняется во время работы
программы. Помимо прочих достоинств, это позволяет избавиться от условной
компиляции, и во многих случаях получается более эффективный код.
На этом мы завершаем беглую экскурсию в мир ООП. Мы старались последовательно
применять введенные здесь термины на протяжении всей книги. Перейдем
теперь к краткому обзору самого языка Ruby.