Алексей Елин писал(а):
В случае использования интерфейсов первичность есть.
Какая?
Взять коллекции – ни они не знают, что в них помещаться будет, в смысле типов, ни сами элементы не знают, что их туда помещать будут.
Коллекция, единственно, должна владеть размером, если хранит не ссылки, а сами элементы...
Алексей Елин писал(а):
Менее эффективно чем макроподстановки, но все же не так провально, а в некоторых случаях вообще без потерь.
В смысле провально? Катастрофично? Или с задержками? Ну так, а чем померить, когда «медленно», а когда – нет? А в случае ссылок, в , как ни крутите, дополнительную косвенность по обращению вводите. Для нескольких элементов это, может быть, и не так заметно, а когда графику или «мелкопорциальные» потоки данных обрабатываете – уже начинаете искать спасения...
Алексей Елин писал(а):
Нет. Я имел в виду менять физический размер экземпляра. А так называемое "инстанцирование" происходит лишь однажды (при компиляции генерика и в модуле генерика), но особым образом, с учетом "динамической природы" экземпляров типов-аргументов. В исползовании "динамических" полей и состоит поддержка со стороны среды выполнения.
Опять не понимаю.
Гипотетический пример.
Код:
MODULE A;
OBJECT FixedLengthArray<ItemType, CONST N:INTEGER>
items: ARRAY N OF ItemType;
...
END FixedLengthArray;
И у меня есть два объявления:
Код:
MODULE B;
VAR
ArrayOfInt: FixedLengthArray<INTEGER,25>;
ArrayOfFloat: FixedLengthArray<REAL,100>;
Если мы храним не ссылки, то объясните мне, как у меня один и тот же экземпляр коллекции в одном и том же месте памяти может обрабатывать объект с разным объёмом занимаемой памяти?
Другое дело, что я понимаю, что (НАПРИМЕР), в модуле A я строю нормально vtbl (или просто ссылки на процедуры, если методы – невиртуальные), НО! В A «некоторые» методы или процедуры (назовём их «вспомогательными»), необходимые для непосредственной обработки обращения к элементам НЕ ОПРЕДЕЛЕНЫ. При объявлении же конкретных массивов, объявляются (в данном случае – анонимные) типы, в которых эти процедуры уже определены. Здесь уже вопросов нет. Мы и гибкость получили, и проверки во время компиляции по типам.
Кстати, начинают проясняться мои непонятки (вот пока сам не начнёшь рассуждать... :о) ) с «где инстанцировать»? Наверное я не очень понятно объяснил. Я имел в виду «построение» «инфраструктуры поддержки типа». То есть «тэговой структуры» для инстанцированного от генерика типа.
В принципе, больших потерь от дублирующих объявлений, навроде
Код:
MODULE M1;
VAR
ArrayOfInt: FixedLengthArray<INTEGER,25>;
...
MODULE M2;
VAR
ArrayOfInt: FixedLengthArray<INTEGER,25>;
...
... не привнесёт, я думаю.
В крайнем случае, остаётся на кого-нибудь упражнение в программировании, для создания «реестра инстанцированных типов», в котором бы были ссылки на описания типы («тэговые структуры»), которые уже были инстанцированы. Там же можно и хранить инфу для компилятора и загрузчика... Но, тогда надо скорректировать идеологии изменения счётчиков клиентов модулей...