Научился сегодня делать интерфейсы "на лету" для классов, которые не поддерживают интерфейсы "стандартным образом".
Получилось что-то типа TVirtualInterface.
Только со связыванием в Compile-Time.
Почти. Но On Demand.
Про реализацию - чуть позже напишу.
Побочным эффектом получилось, что можно отдавать класс "как интерфейс", но без лишнего подсчёта ссылок. Делегат что ли это называется.
Грубо говоря у класса получаются ДВЕ реализации IUnknown, одна с подсчётом ссылок, а другая - БЕЗ оного.
Чем то схоже с Protocol в Objective-C.
Ну и DuckTyping там где-то рядом.
Класс может выдать себя в качестве "утки, которая умеет махать крыльями".
При этом он не является IDuck или TDuck.
Построено всё на перекрытии NewInstance и распределении дополнительной памяти "за объектом". И в этой дополнительной памяти "варим" виртуальные таблицы для каждого из "интерфейсов"/protocol'ов. По образу и подобию того как это в Delphi сделано, только эта таблица инициализируется "на лету" из метода FillProtocolVMT. Туда пихаются указатели на методы нашего объекта.
Можно в принципе вообще "на лету" варить такие таблицы, совсем "onDemand". Например в QueryInterface. Только я пока не придумал зачем.
Ну и пока у меня есть ограничения на типы и количество параметров. Таких методов.
Попутно я научился цеплять к каждому классу свой менеджер памяти. С возможностью кеширования только определённого количества экщемпляров. Ну и попутно научился делать память экземпляров immutable, через virtualAlloc и virtualProtect. Экземпляры таких классов реально immutable. Они могут модифицироваться только в конструкторах и деструкторах. А во всё остальное время жизни экщемпляров - они readOnly. Доступ к полям на запись, даже "случайный" вызывает pageFault.
То есть можно делать реально константные кешируемые объекты.
Ну это функциональными языками "навеяло".
Дальше можно делать expressionOnDemand. Выражения, вычисляемые и кеширумые по мере необходимости.
Правда вся эта конструкция пока несколько "шаткая" и до конца не отлажена, но ничего. Отлажу.
Для начала могу опубликовать реализацию реально константных кешируемых строк. Эта конструкция уже отлажена. Она в производстве уже год как.
Получилось что-то типа TVirtualInterface.
Только со связыванием в Compile-Time.
Почти. Но On Demand.
Про реализацию - чуть позже напишу.
Побочным эффектом получилось, что можно отдавать класс "как интерфейс", но без лишнего подсчёта ссылок. Делегат что ли это называется.
Грубо говоря у класса получаются ДВЕ реализации IUnknown, одна с подсчётом ссылок, а другая - БЕЗ оного.
Чем то схоже с Protocol в Objective-C.
Ну и DuckTyping там где-то рядом.
Класс может выдать себя в качестве "утки, которая умеет махать крыльями".
При этом он не является IDuck или TDuck.
Построено всё на перекрытии NewInstance и распределении дополнительной памяти "за объектом". И в этой дополнительной памяти "варим" виртуальные таблицы для каждого из "интерфейсов"/protocol'ов. По образу и подобию того как это в Delphi сделано, только эта таблица инициализируется "на лету" из метода FillProtocolVMT. Туда пихаются указатели на методы нашего объекта.
Можно в принципе вообще "на лету" варить такие таблицы, совсем "onDemand". Например в QueryInterface. Только я пока не придумал зачем.
Ну и пока у меня есть ограничения на типы и количество параметров. Таких методов.
Попутно я научился цеплять к каждому классу свой менеджер памяти. С возможностью кеширования только определённого количества экщемпляров. Ну и попутно научился делать память экземпляров immutable, через virtualAlloc и virtualProtect. Экземпляры таких классов реально immutable. Они могут модифицироваться только в конструкторах и деструкторах. А во всё остальное время жизни экщемпляров - они readOnly. Доступ к полям на запись, даже "случайный" вызывает pageFault.
То есть можно делать реально константные кешируемые объекты.
Ну это функциональными языками "навеяло".
Дальше можно делать expressionOnDemand. Выражения, вычисляемые и кеширумые по мере необходимости.
Правда вся эта конструкция пока несколько "шаткая" и до конца не отлажена, но ничего. Отлажу.
Для начала могу опубликовать реализацию реально константных кешируемых строк. Эта конструкция уже отлажена. Она в производстве уже год как.
Наконец-то новые посты
ОтветитьУдалитьНу на самом деле - писать особо не о чём. Не интересно видимо это всё читать.
УдалитьНапротив. Читать интересно, но мало =)
УдалитьЧто именно интересно?
УдалитьПросто - устал писать "в воздух". И огребать неконструктивную критику.
УдалитьЯ ведь писал не потому, что "прав" или "нашёл серебряную пулю". А потому что "в поиске".
И иногда, как мне кажется бывает интересные решения. Которыми хочется поделиться. Но отгребать - "функции говно" - надоело.
Так это и интересно. Поиск и рассуждения. И авторский стиль.
УдалитьХорошо, коли "авторский стиль".
Удалить