На форуме обсуждали возможность создания пользовательских типов (классов). Эта тема давно обдумывалась и даже были попытки ее реализации в виде отдельного проекта пакета CNET. Теперь предлагается к рассмотрению вторая попытка сделать что-то похожее на реализацию наследования классов в парадигме схемотехники HiAsm. Это не полноценное решение, а только концепт. Для тестирования были сделаны несколько элементов и пример создания с их помощью двух пользовательских классов, которые, в свою очередь, являются наследниками третьего базового класса. В примере создаются экземпляры двух пользовательских классов и проверяется доступ к полям экземпляров базового и производного классов. Причем, для базового класса используется ссылка (link) на элемент для одновременного редактирования всех его экземпляров. Пример для тестирования: http://svn.hiasm.com/packs/CNET/Example/Class/UserClass.sha
Этот топик читают: Гость
Главный модератор
Ответов: 2999
Рейтинг: 396
|
|||
карма: 6 |
|
Главный модератор
Ответов: 2999
Рейтинг: 396
|
|||
На данный момент реализованы несколько основных элементов для создания пользовательского типа (класса):
Для обращения «снаружи» к членам класса созданы интерфейсные элементы: Внутри класса интерфейсные элементы подключаются к внутренним членам класса с помощью менеджеров. Если в стандартном пакете MultiElement - это изначально отдельный unit (класс), то в пакете CNET «мультик» представляет собой только абстрактный уровень иерархии схемы, упрощающий её визуальное восприятие. Поэтому сделать из «мультика» пользовательский тип (класс) несколько сложнее чем в пакете Windows. Получается что все, помещённые в «мультик» элементы, определяются в создаваемом пользовательском типе. Следует также различать обращение к внутренним членам класса «внутри» класса и «снаружи» - для этого, как правило, реализованы соответствуюшие методы. Возможно, в будущем, получится унифицировать доступ, если появится точный критерий определения источника вызова. Примеры использования пользовательского типа: http://svn.hiasm.com/packs/CNET/Example/Class/UserClassStatic.sha http://svn.hiasm.com/packs/CNET/Example/Class/SingletonMultithread.sha http://svn.hiasm.com/packs/CNET/Example/Class/UserIndexer.sha http://svn.hiasm.com/packs/CNET/Example/graphics/Arcanoid2.sha http://svn.hiasm.com/packs/CNET/Example/graphics/DynamicBall_3.sha |
|||
карма: 6 |
| ||
Голосовали: | miver, Konst |
Главный модератор
Ответов: 2999
Рейтинг: 396
|
|||
Пример использования пользовательского класса и вычисление абсолютно упругого соударения большого количества окружностей:
cnet_collisions_balls.png |
|||
карма: 6 |
| ||
файлы: 2 | cnet_collisions_balls.png [21.8KB] [858], dynamiccollisionsball.sha [14.9KB] [480] |
Главный модератор
Ответов: 2999
Рейтинг: 396
|
|||
Экспериментальная оптимизация компонента Hub:
smarthub.sha smart_hub2.png code
|
|||
карма: 6 |
| ||
файлы: 2 | smarthub.sha [632B] [454], smart_hub2.png [2.2KB] [731] | ||
Голосовали: | Konst, miver |
Ответов: 758
Рейтинг: 112
|
|||
карма: 1 |
| ||
файлы: 1 | code_33615.txt [728B] [614] |
Главный модератор
Ответов: 2999
Рейтинг: 396
|
|||
Поправил
|
|||
карма: 6 |
|
Ответов: 758
Рейтинг: 112
|
|||
Теперь непонятно как работает
Выше приведенная схема дает код code_33616.txt Почему не так code_33617.txt |
|||
карма: 1 |
| ||
файлы: 2 | code_33616.txt [564B] [499], code_33617.txt [435B] [571] |
Главный модератор
Ответов: 2999
Рейтинг: 396
|
|||
miver писал(а): Теперь непонятно как работаетКод экспериментальный - предлагайте свой вариант - рассмотрим и оставим лучший. |
|||
карма: 6 |
|
Ответов: 758
Рейтинг: 112
|
|||
Nic, предлагаю такой вариант кода компонента Hub
code_33645.txt Если б можно было предварительно определить типы всех входных данных, то можно было бы не формировать процедуру для данных одного типа. То есть когда тип данных встречается только один раз. |
|||
карма: 1 |
| ||
файлы: 1 | code_33645.txt [1.1KB] [532] |
Главный модератор
Ответов: 2999
Рейтинг: 396
|
|||
карма: 6 |
| ||
файлы: 1 | code_33648.txt [875B] [573] |
Ответов: 758
Рейтинг: 112
|
|||
карма: 1 |
| ||
файлы: 1 | code_33649.txt [541B] [516] |
Главный модератор
Ответов: 2999
Рейтинг: 396
|
|||
Вот именно, хотя обычный Hub - вызывается трижды.
|
|||
карма: 6 |
|
Ответов: 758
Рейтинг: 112
|
|||
Nic, можно ли вставлять код после вызова всех точек doEvent
Если да, то можешь подсказать как |
|||
карма: 1 |
|
Главный модератор
Ответов: 2999
Рейтинг: 396
|
|||
miver писал(а): можно ли вставлять код после вызова всех точек doEvent?Для этого надо уметь определять какой вызов хаба последний, что, наверное, невозможно при рекурсивном обходе дерева элементов. |
|||
карма: 6 |
|
Ответов: 4628
Рейтинг: 749
|
|||
Nic, так ты же добавил "финализирующий" метод в кодогенератор? В процессе работы компонента собирается вся нужная информация из doEvent, затем в "финале" генерируется окончательный код. Нет?
|
|||
карма: 26 |
|