Совсем недавно обнаружил для себя заужение типа результата переопределённой функции.
Цитата:
PROCEDURE (v: View) ThisModel (): TextModels.Model
EXTENSBIBLE
Result type is narrowed.
Код:
MODULE PrivNarrow;
TYPE
Item* = POINTER TO ABSTRACT RECORD END;
List* = POINTER TO ABSTRACT RECORD END;
MyItem* = POINTER TO ABSTRACT RECORD (Item) END;
MyList* = POINTER TO ABSTRACT RECORD (List) END;
PROCEDURE (l: List) Set* (x: Item), NEW, ABSTRACT;
PROCEDURE (l: List) Get* (): Item, NEW, ABSTRACT;
PROCEDURE (l: MyList) Set* (x: Item), ABSTRACT; (* параметр не захотело заужать *)
PROCEDURE (l: MyList) Get* (): MyItem, ABSTRACT;
END PrivNarrow.