Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) [RClassMngr] ООП для V8. Добавляем наследование (число прочтений - 6787 )
Robert
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 86
Зарегистрирован: 20. Сентября 2006
[RClassMngr] ООП для V8. Добавляем наследование
15. Марта 2009 :: 16:27
Печать  
Сделал вот такую компоненту. Получаются почти классы.

http://infostart.ru/projects/3629/
  
Наверх
ICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: [RClassMngr] ООП для V8. Добавляем наследование
Ответ #1 - 16. Марта 2009 :: 08:54
Печать  
Для начала отлично.
В свое время мы с Dmitro думали над возможными реализациями ООП в 8ке, и пришли почти к такому же решению, однако делать не стали.

Так сразу же вопросы и пожелания и своя толика видения развития.

Сделано ли множественное наследование?
Будет ли какая-то декларативность в описании классов?

То есть сейчас наследование (и обращение из класса к базовым методам) делается "ручками":
в инициализируещем методе обработки сами создаем объект ВК, и объекты базовых классов.
Если хотим обращаться к методам базовых классов, то должны сами сохранить где-то (например в переменных модуля) ссылки на нами же созданные объекты.

А вот тут Dmitro (как больший чем я спец по 8ке) подсказывает - у обработки могут быть реквизиты обработки с типом "ОбработкаОбъект.ИмяКакойтоОбработки", которые как-раз и было бы удобно использовать как базовые классы.
Те у ВК допустим метод - CreateClass(ИмяОбработки)
ВК создает эту обработку, базовые классы создаются САМИ как реквизиты этой обработки.
Дальше ВК должна просто обойти реквизиты обработки, выделить среди них те, которые есть базовые классы (может там инфа в синонимах метаданных и тп), и вернуть уже свой объект. Также для каждого подобъекта, являющегося классом, можно будет вызывать какой-то инит-метод, в который передавать ссылку на конечный объект, для реализации виртуальных вызовов (аналог Сам(Контекст) в 1С++).

Вобщем, надо думать над этим, и для начала определиться со стандартами - как прописывать/создавать иерархию наследования, как инициализировать, как описать public/protected/private методы и наследование,  и тп.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: [RClassMngr] ООП для V8. Добавляем наследование
Ответ #2 - 16. Марта 2009 :: 09:23
Печать  
Вот как пример стандарта:
Все реквизиты обработки, чье имя начинается с "класс" - считать базовыми классами и включить в процедуру поиска метода.
При этом, как уточнил Dmitro, вовсе необязательно, чтобы этот реквизит был типа ОбработкаОбъект.Имя, можно и документ, и справочник, и тп. (имена реквизитов обработки в реализации ВК можно перебрать через метаданные).

Такой подход - иерархия на реквизитах обработки даст подспорье и при редактировании в конфигураторе, в плане intellisence.
  
Наверх
 
IP записан
 
Robert
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 86
Зарегистрирован: 20. Сентября 2006
Re: [RClassMngr] ООП для V8. Добавляем наследование
Ответ #3 - 16. Марта 2009 :: 10:13
Печать  
Множественное наследование есть. Метод Инит может принимать 16 базовых классов. Если у базовых объектов совпадают методы или свойства, то обращение идет к методу объекта, указанного раньше в цепочке параметров метода Инит.

Декларации класса отдельно от реализации сейчас нет. Тут музыку заказывает платформа V8. Именно в модуле объекта обработки указывается состав приватных и публичных методов и переменных. Можно сделать декларацию, но она будет вторична. Зачем? (Если только для указания количества параметров в методе. Сейчас появляется ошибка, если параметров недостаточно. Если их больше, то ошибка не появляется. Лишние параметры просто игнорируются.)

Что касается реквизитов обработки. Можно и так сделать. Я думал делать переменную модуля, если нужно сохранить ссылку на базовый класс. В нынешнем варианте создание класса выполняется в процедуре _КакКласс. Здесь у разработчика максимум свободы. Класс можно создавать на основе здесь же созданных объектов или реквизитов обработки или чего-то еще. _КакКласс может быть параметризованным, куда при создании класса может быть передан экземпляр документа, справочника или элемента формы. Зачем задавать жесткий алгоритм создания класса только на основе реквизитов обработки с формализованными именами?? В чем смысл?

  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: [RClassMngr] ООП для V8. Добавляем наследование
Ответ #4 - 16. Марта 2009 :: 10:51
Печать  
Роберт, зафиксированные реквизиты обработки как базы удобны тем, что прописал один раз в режиме Конфигуратора (или мышкой пощелкать) и больше ничего не нужно писать, в т.ч. и в модуле.

В итоге текст класса упрощается + добавляются удобные фичи, например, те, что выше привел Александр.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: [RClassMngr] ООП для V8. Добавляем наследование
Ответ #5 - 16. Марта 2009 :: 10:52
Печать  
Robert писал(а) 16. Марта 2009 :: 10:13:
Зачем задавать жесткий алгоритм создания класса только на основе реквизитов обработки с формализованными именами?? В чем смысл?

Чтобы превратить то, что ты создал - смесь из: ручное создания кирпичиков + укладка кирпичиков в блоки + итератор по методам кирпичиков - в нормальное ООП.

Плюс на инфостарте по виртуальным методам - то что ты Артуру предложил - это не совсем то, по этой схеме неполучится из базового класса вызвать метод, переопределенный в наследнике. А если подумать, то реализовать это достаточно просто.
  
Наверх
 
IP записан
 
Robert
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 86
Зарегистрирован: 20. Сентября 2006
Re: [RClassMngr] ООП для V8. Добавляем наследование
Ответ #6 - 16. Марта 2009 :: 11:51
Печать  
Если передать в базовый класс ссылку на класс наследник, то можно и переопределенный метод вызвать. Почему нет? Как ты видишь реализацию виртуальных методов?
Давайте все вместе обсудим. Правильно ли я вас понимаю. Вы предлагаете следующую технологию.

Описание класса выгладит следующим образом.
Это объект конфигурации (обработка, отчет, документ, справочник) именованный по определенному шаблону. Например, классХХХХ.
Объект имеет реквизиты, именованные по опр шаблону. Например, классХХХХ. Тип реквизита определяет тип базового класса. Базовый класс должен быть агрегатным объектом.
В модуле объекта мы пишем реализацию класса.
Переменные с ключ словом Экспорт становятся публичными свойствами. Без - приватными.
Процедуры и функции с ключ словом Экспорт становятся публичными методами. Без - приватными.
Как сюда воткнуть виртуальные методы я не очень понимаю.
В модуле могут также находится процедуры Конструктор и Деструктор. Должны быть с ключ словом Экспорт. Прямой вызов этих методов будет блокироваться.

ОК. Механизм создания класса.
Factory=Новый COMОбъект("RClassMngr.Factory");
Cls=Factory.CreateObject("классХХХХ");

Что происходит.
Компонента ищет в методанных объект с этим именем. Или\И на диске ищет внешние обработки\отчеты в определенных каталогах.
Создается экземпляр объекта.
Перебираем реквизиты объекта. Отбираем реквизиты по шаблону.
Для каждого найденного реквизита определяем тип.
Создаем новые агрегатные объекты. Сохраняем ссылки в реквизитах. Добавляем реквизиты в число базовых объектов класса.
Если базовый объект является классом, вызываем его конструктор.
Вызываем конструктор класса.

Как быть, если я хочу, чтобы базовый объект не создавался ВК, а был взят готовый? Например, конкретный документ или списокзначений на форме?
  
Наверх
ICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: [RClassMngr] ООП для V8. Добавляем наследование
Ответ #7 - 16. Марта 2009 :: 12:36
Печать  
Тут надо все обдумывать. В 8ке я не спец.
Как сказал Dmitro, если реквизит обработки имеет тип ОбработкаОбъект, он создается сам, автоматом.
Как насчет других типов - не знаю, наверное создаются просто пустые (типа как в 7ке - СоздатьОбъект("Документ")Подмигивание
Если нужны установить готовый - передавать в метод CreateObject твоей фабрики, с указанием, для какого базового класса передается.
Например
а = фабрика.Создать("МойКласс", "Документ=", НужныйДок);

реквизиты обработки доступны для записи, те ты в ВК можешь создать объект обработки, и присвоить ее реквизиту переданное значение.
Сами обработки называть именно с префиксом "класс" не нужно. Нужен способ определить, какие из реквизитов создаваемой обработки являются базовыми классами. Как вариант - название такого реквизита должно начинаться с "класс", например реквизит "классБазовый", тип реквизита - Обработка.Объект.БазоваяОбработка. Еще вариант - у любой обработки можно получить метаданные, перебирать в них реквизиты, и то что это класс, определять из допустим синонима метаданных реквизита обработки.

Теперь виртуальность. Допустим декларируем, что реквизит обработки с именем "Контекст" - предопределенный, и в твоей ВК при создании объектов, если у них есть реквизит Контекст, записывать туда ссылку на создаваемый объект:
Например, иерархия Класс2 наследуем от Класс1.
Создается твой COM объект, obj1, для Класс2.
В созданном объекте обработки в реквизит Контекст записывается ссылка на obj1.
Перебирая его базовые классы, находим Класс1, у него тоже есть реквизит Контекст. Туда тоже записываем ссылку на obj1.
Теперь в Класс1 можно написать Контекст.Метод1();
Если Класс2 переопределил Метод1, то вызовется его реализация, иначе реализация из Класс1.
Такой метод прмименяется в 1С++, называется Сам(Контекст).
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: [RClassMngr] ООП для V8. Добавляем наследование
Ответ #8 - 16. Марта 2009 :: 12:38
Печать  
В принципе, нормальная схема.

Но нужно дополнить:
1. Цитата "Если передать в базовый класс ссылку на класс наследник" - здесь скорее всего, будет циклическая ссылка и у 1С возникнет утечка Печаль
Но нужно тестить, конечно Улыбка

2. По базовым объектам, которые не есть классы.
Можно пойти по методу 1С++, т.е.
а) при создании объекта создает пустую ссылку на базу
2) добавить спец.метод ООП, который подменяет чистый контекст на существующий объект.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: [RClassMngr] ООП для V8. Добавляем наследование
Ответ #9 - 16. Марта 2009 :: 12:49
Печать  
artbear писал(а) 16. Марта 2009 :: 12:38:
1. Цитата "Если передать в базовый класс ссылку на класс наследник" - здесь скорее всего, будет циклическая ссылка и у 1С возникнет утечка Печаль
Но нужно тестить, конечно Улыбка


Фишка в том, что для реализации виртуальности, передавать в базовый класс ссылку на класс наследник нужно не тот объект обработки, который создает сама 1С, и счетчиком ссылок которого мы не можем управлять, а ссылку на COM-объект-"обертку", который создает Robert для этого объекта, и счетчик ссылок которого в его полном распоряжении Улыбка

Но тестить да, нужно!
  
Наверх
 
IP записан
 
Robert
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 86
Зарегистрирован: 20. Сентября 2006
Re: [RClassMngr] ООП для V8. Добавляем наследование
Ответ #10 - 16. Марта 2009 :: 12:54
Печать  
ОК. Попробую сделать.
  
Наверх
ICQ  
IP записан
 
Robert
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 86
Зарегистрирован: 20. Сентября 2006
Re: [RClassMngr] ООП для V8. Добавляем наследование
Ответ #11 - 16. Марта 2009 :: 21:25
Печать  
Вот так в первом приближении.
Ограничения: Классы могут быть только среди обработок конфигурации. Базовый класс не может быть унаследован от третьего класса, т.е. только два уровня иерархии классов.
Реквизиты, определяющие базовые классы, имеют префикс "класс".
Создание экземпляра класса:
Код
Выбрать все
ЗагрузитьВнешнююКомпоненту("RClassMngr.dll");
Cls = Новый COMОбъект("RClassMngr.Class");                                    
Cls._CreateObject("Класс1");
Cls.МетодКласса(); 

  

RClassMngr.dll ( 33 KB | Загрузки )
Наверх
ICQ  
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: [RClassMngr] ООП для V8. Добавляем наследование
Ответ #12 - 13. Октября 2010 :: 05:46
Печать  
Robert писал(а) 15. Марта 2009 :: 16:27:
Сделал вот такую компоненту. Получаются почти классы.
http://infostart.ru/projects/3629/

Идея прижилась или умерла?
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать