Logo

Объектно-ориентированное программирование на Канторе

Постулаты

  • Точкой схождения всех абстракций является null.
  • Общий базовый класс (условный TObject) является обобщением (generic).
  • Условные типы TObject и Variant — одно и то же.

Модель ООП в Канторе

Поскольку класс — тоже функция, модель ООП в Канторе основана на обобщениях:
  • У классов нет единого общего предка.
  • Все классы являются раскрытием анонимного беспараметрического обобщения — null.
Модель ООП в Канторе близка C++, но все базовые типы описаны через аналог шаблонов, чего не было сделано в C++. Кантор исправляет ошибки предшественников и является компилируемым языком с объектами первого класса.

Конечные классы

Объявление final class определяет класс фиксированного размера, а вот виртуальные методы у него могут быть, если они в нем объявлены. В этом случае фиксированный размер учитывает указатель на VMT.
final class pointRec of 
  public final var Core:Integer X, Y;
end;

final class pointObj of
  public var Core:Integer X, Y;
end;
В этом примере оба класса имеют фиксированную размерность, но pointRec не имеет VMT, а pointObj имеет, в нем 4 метода — in/out на каждое var-свойство.

Почему наследование нельзя заменить агрегацией

Если встать на сторону противников ООП, наследование можно рассматривать как разновидность агрегации. Это и в самом деле так, но наследование — анонимная агрегация, поскольку для доступа к унаследованным свойствам не нужно указывать имя предка. Если заменить наследование обычной агрегацией, анонимность потеряется.

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

Более того, отсутствие ключевых атрибутов обозначает в Канторе особый или служебный смысл. Анонимная агрегация — не исключение, за ней скрывается смысл наследование.

Множественное наследование и SOLID

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

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

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

См. также

Комментариев нет :

Отправить комментарий

Выбрав в выпадающем списке пункт «Имя/URL», можно оставить комментарий от своего имени без предварительной регистрации.