Содержание


Язык программирования Nimrod

Часть 7. Поддержка объектно-ориентированного программирования

Comments

Серия контента:

Этот контент является частью # из серии # статей: Язык программирования Nimrod

Следите за выходом новых статей этой серии.

Этот контент является частью серии:Язык программирования Nimrod

Следите за выходом новых статей этой серии.

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

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

1. Поддержка объектно-ориентированного программирования в Nimrod

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

1.1. Объекты

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

Новые типы объектов могут быть определены только в секции type. Доступ к типу объекта во время выполнения осуществляется при помощи оператора of, который может быть использован ещё и для проверки типа объекта. Поля объекта можно сделать доступными извне, то есть из-за пределов модуля, в котором был определён объект, если пометить их символом "звёздочка" (*). Различные типы объектов ни при каких обстоятельствах не могут считаться эквивалентными (равными), даже если они имеют одинаковые наборы полей, в отличие от кортежей.

Наследование объектов осуществляется посредством синтаксической конструкции object of. Множественное наследование в текущей версии Nimrod пока ещё не поддерживается. Если для какого-либо объекта не удаётся выбрать подходящего предка, то в этом качестве можно использовать TObject. Следует отметить, что этот выбор является всего лишь соглашением, но не обязательным требованием. Объекты, не имеющие предка, неявно получают статус final. Кроме предопределённого корневого объекта system.TObject, могут быть определены альтернативные корневые объекты с возможностью наследования от них при помощи прагмы inheritable.

Для лучшего понимания описанных выше свойств объектов в листинге 1 приведён пример определения двух объектов.

Листинг 1. Объекты в языке программирования Nimrod
type
  TEmployee {.inheritable.} = object   # новый корневой объект; не потомок TObject
    name*: string  # Символ '*' позволяет получать доступ к name из других модулей
    age: int       # Без звёздочки поле age скрыто от других модулей
    dept: string

  TFulltimer = object of TEmployee  # выполняется наследование
    weeklySalary: float   # К полям объекта TEmployee 
	добавляется поле weeklySalary (скрытое)

  THourlyWorker = object of TEmployee
    wageForHour: float
    workHours: int

var
  employee: TEmployee
  headOfDept: TFulltimer
  designer: THourlyWorker

if( designer of THourlyWorker):
  echo( "designer - работник с почасовой оплатой" )
else:
  echo( "designer - тип объекта неизвестен" )

1.2. Преобразования типов объектов

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

Синтаксис преобразования типов похож на вызов обычной процедуры:

требуемый_тип( преобразуемое_выражение )

Пример корректного преобразования типов приведён в листинге 2.

Листинг 2. Преобразование типов объектов
# Предполагается, что данное преобразование выполняется в том же пространстве имен,
# в котором определены типы объектов из листинга 1.
proc getWorkHours( cleaner: TEmployee ): int =
  return THourlyWorker(cleaner).workHours

В том случае, если cleaner не является объектом типа THourlyWorker, будет сгенерировано исключение EInvalidObjectConversion.

1.3. Приведение типов

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

Пример приведения типа:

cast[int](char_letter)

В данном случае символьная переменная char_letter безусловно интерпретируется, как целочисленная переменная типа int.

1.4. Взаимно рекурсивные типы объектов

С помощью объектов (в более простых случаях - кортежей) и ссылок можно создавать сложные структуры данных, зависящих друг от друга (содержащих поля-ссылки друг на друга). Такие типы объектов называют взаимно рекурсивными (mutually recursive). В Nimrod взаимно рекурсивные объекты могут быть объявлены только в одной и той же секции type, иначе приходилось бы выполнять поиск используемых символов по всему исходному коду в других секциях type, что замедлило бы процесс компиляции.

В листинге 3 приведён пример объявления взаимно рекурсивных объектов, содержащих ссылки друг на друга.

Листинг 3. Взаимно рекурсивные объекты в Nimrod
type
  PNode = ref TNode  # ссылка на объект, объявляемый в этой же секции
  TNode = object
    left, right: PNode  # левая и правая ветви дерева
    sym: ref TSym       # листья ссылаются на объекты типа TSym
  TSym = object         # объявляется тип "символ"
    name: string        # имя символа
    line: int           # номер строки, в которой был объявлен символ
    code: PNode         # абстрактное синтаксическое дерево для рассматриваемого символа

Заключение

В данной статье рассматривалась поддержка основных концепций объектно-ориентированного программирования в языке Nimrod: инкапсуляция данных и наследование.


Ресурсы для скачивания


Похожие темы


Комментарии

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source, Linux
ArticleID=856958
ArticleTitle=Язык программирования Nimrod: Часть 7. Поддержка объектно-ориентированного программирования
publish-date=01312013