Основы объектно-ориентированного проектирования

         

Последовательное выполнение и наследование


Даже если класс Simula не использует механизмы сопрограмм (detach, resume), он помимо компонентов имеет тело (последовательность инструкций) и может вести себя как процесс в дополнение к своей обычной роли реализации АТД. В сочетании с наследованием это свойство ведет к более простой версии того, что в обсуждении параллелизма называлось аномалией наследования. Язык Simula, благодаря ограничениям (наследование единичное, а не множественное; сопрограммы, а не полный параллелизм), способен обеспечить языковое решение проблемы аномалии.

Пусть bodyC - это последовательность инструкций, объявленная как тело C, а actual_bodyC - последовательность инструкций, выполняемая при создании каждого экземпляра C. Если у C нет предка, actual_bodyC - это просто bodyC. Если у C есть родитель A (один, поскольку наследование одиночное), то actual_bodyC - по умолчанию имеет вид:

actual_bodyA; bodyC

Другими словами, тела предков выполняются в порядке наследования. Но эти действия по умолчанию, возможно, не то, что нужно. Для изменения порядка действий, заданных по умолчанию, Simula предлагает инструкцию inner, обозначающую подстановку тела наследника в нужное место тела родителя. Тогда действия по умолчанию эквивалентны тому, что inner стоит в конце тела предка. В общем случае тело A выглядит так:

instructions1; inner; instructions2

Тогда, если предположить, что само A не имеет предка, actual_bodyC имеет вид:

instructions1; bodyC; instructions2

Хотя причины введения подобной семантики ясны, соглашение выглядит довольно неуклюже:

  • во многих случаях потомкам необходимо создать свои экземпляры не так, как их предкам (вспомните POLYGON и RECTANGLE);
  • тела родителей и потомков, как, например C, становится трудно понять: прочтение bodyC еще ничего не говорит о том, что будет делаться при выполнении new;
  • соглашение не переносится естественным образом на множественное наследование (хотя это не прямая забота Simula).

Трудности с inner - типичное следствие активности объектов, о чем говорилось при обсуждении параллелизма.

Почти все ОО-языки после Simula отказались от соглашения inner и рассматривали инициализацию объекта как процедуру.



Содержание раздела