artbear писал(а) 14. Октября 2010 :: 06:54:Dmitry The Wing писал(а) 14. Октября 2010 :: 01:44:А может тогда реально объединить функционал с 1С++?
Перечисленный функционал классам очень бы пригодился...
Dmitry The Wing писал(а) 07. Октября 2010 :: 02:22:Из описания особо заинтересновало то, чего не хватает в 1с++:
- Виртуальное наследование.
- Возможность удаления динамических свойств.
- Управление уровнем доступа к методам и свойствам класса.
- Множественность конструкторов.
- Статические модули и классы (про методы и свойства из описания не видно).
Ага, мне также интересно, как Саша реализовал эти фичи
Особенно последние 3 !
Управление уровнем доступа к методам и свойствам класса.
тк для обращения к методам базовых классов используется прямой вызов (не через Сам(Контекст).БазовыйМетод(), а просто БазовыйМетод() ), то имеется возможность определить, ищется ли имя метода при компиляции класса, или уже при его работе (вызов метода "извне"). За счет этого и сделано - методы объявленные Экспорт - находятся всегда (public), методы без Экспорт, но начинающиеся с "__" - находятся только при компиляции модуля класса (protected), все остальные случаи - private.
В 1С++ имхо реализуемо, если добавить прямой вызов базовых методов.
Множественность конструкторов.
Ну в 1С++ вроде есть ФабрикаОбъектов, реализующая данный функционал. Просто у меня несколько расширено -
в def-файле в описании класса вообще описываются только конструкторы класса, причем для каждого конструктора можно описать, как вызываются конструкторы базовых классов, например
класс Базовый
{
Конструктор1();
Конструктор2(Парам);
}
класс Наследник : Базовый
{
Конс1() : Базовый_к_Конструктор1();
Конс2(Парам) : Базовый_к_Конструктор2(Парам);
Конс3() : Базовый_к_Конструктор2(10);
}
те если как-то обеспечить ФабрикуОбъектов информацией о порядке вызова базовых конструкторов, то вполне реализуемо.
Статические модули и классы
Тут вся фишка в том, что 1Class грузиться до инициализации глобальника. Тогда получается добавить к глобальному контексту свои имена свойств (как например делает сама 1С для объектов типа ФС, Регистры и тп). В def-файле объявляется некое имя как модуль и указывается его тип объекта. Например, объявили модуль "ГлобальныйКласс". Теперь при компиляции любого модуля 1С не будет ругаться на использование имени "ГлобальныйКласс". Само создание объекта будет выполнено в момент первого обращения к нему. При дальнейших обращениях будет возвращена ссылка на уже созданный объект.
В 1С++ в-принципе реализуемо для любого модуля, кроме ГМ.
Виртуальное наследование.
Делается элементарно. Каким-либо образом в объявлении класса указывается, что базовый класс - виртуальный (у меня просто перед именем базового класса ставится знак "=", не хотелось усложнять парсер). При создании объекта класса, если базовый класс объявлен как виртуальный, то сначала он ищется в уже созданных базовых классах. Если не найден - создаем объект указанного типа. Если же найден, то он и используется как базовый.