Метод продолжения
Материал из Википедии — свободной энциклопедии
Концепт в концептно-ориентированном программировании может пониматься как пространство. Это пространство имеет границу, которую должен пересечь любой запрос на доступ, направленный к подконцепту. Концепт обычно хочет перехватить запросы на доступ такие как вызовы методов или сообщения, проходящие через его границу, с тем, чтобы выполнить нужные промежуточные операции. Для этой цели концепт может определить пару специальных двойственных методов продолжения, которые вызываются для перехвата проходящих запросов на доступ.
Методы продолжения являются частью механизма концептов, используемых в концептно-ориентированном программировании. Концепт состоит из класса объектов и класса ссылок. Как обычно, один метод продолжения определяется в классе объекта, тогда как другой определяется в классе ссылки.
Метод продолжения класса ссылки предназначен для разрешения этой ссылки в замещенную корневую ссылку. Он позволяет нам получить непосредственную ссылки из опосредованной ссылки. Непосредственная корневая ссылка может затем использоваться для доступа к представляемому объекту. Идея состоит в том, что программист определяем нужный формат ссылки в классе ссылки и затем пишет процедуру разрешения в методе продолжения.
Метод продолжения класса объектов вызывается после того, как ссылка на данный объект была полностью разрешена в корневую ссылку. Другими словами, метод продолжения объекта это самый первый метод, вызываемый для данного объекта, после разрешения его ссылки. Мы говорим, что с помощью этого метода процесс входит в пространство объекта. Методы продолжения объектов и ссылок перемежаются, то есть вызываются друг после друга.
В следующем примере показано как можно определить методы продолжения концепта:
concept MyConcept in ParentConcept class { int myField; void continue() { print("MyConcept: Enter scope.\n"); continue(); print("MyConcept: Exit scope.\n"); } } reference { int id; // Identifier void continue() { // Reference resolution print("MyConcept: Start reference resolution.\n"); Object o = resolve(id); o.continue(); print("MyConcept: End reference resolution.\n"); } }
В этом примере метод продолжения класса объектов печатает два сообщения когда процесс входит в его пространство, а также когда он покидает пространство. Метод продолжения класса ссылки печатает два сообщения перед началом разрешения ссылки и после того, как она была разрешена и использована для доступа к объекту. Само разрешение реализовано с помощью метода resolve(), который должен быть определен где-то в концепте. Важно, что оба метода также вызывают метод продолжения, когда по их мнению процесс должен перейти к следующему шагу в последовательности доступа. В частности, метод продолжения класса ссылки применяет метод продолжения к только что разрешенной корневой ссылке: o.continue(). Поскольку это корневая ссылка, компилятор рассматривает ее как непосредственное представление следующего объекта и вызывает его метод продолжения.