На форуме обсуждали возможность создания пользовательских типов (классов). Эта тема давно обдумывалась и даже были попытки ее реализации в виде отдельного проекта пакета CNET. Теперь предлагается к рассмотрению вторая попытка сделать что-то похожее на реализацию наследования классов в парадигме схемотехники HiAsm. Это не полноценное решение, а только концепт. Для тестирования были сделаны несколько элементов и пример создания с их помощью двух пользовательских классов, которые, в свою очередь, являются наследниками третьего базового класса. В примере создаются экземпляры двух пользовательских классов и проверяется доступ к полям экземпляров базового и производного классов. Причем, для базового класса используется ссылка (link) на элемент для одновременного редактирования всех его экземпляров. Пример для тестирования: http://svn.hiasm.com/packs/CNET/Example/Class/UserClass.sha
Этот топик читают: Гость
|
Главный модератор
Ответов: 3000
Рейтинг: 396
|
|||
| карма: 6 |
|
|
Главный модератор
Ответов: 3000
Рейтинг: 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 |
|
Главный модератор
Ответов: 3000
Рейтинг: 396
|
|||
|
Пример использования пользовательского класса и вычисление абсолютно упругого соударения большого количества окружностей:
|
|||
| карма: 6 |
| ||
| файлы: 2 | cnet_collisions_balls.png [21.8KB] [1037], dynamiccollisionsball.sha [14.9KB] [616] |
|
Главный модератор
Ответов: 3000
Рейтинг: 396
|
|||
|
Экспериментальная оптимизация компонента Hub:
smarthub.sha |
|||
| карма: 6 |
| ||
| файлы: 2 | smarthub.sha [632B] [604], smart_hub2.png [2.2KB] [906] | ||
| Голосовали: | Konst, miver |
|
Ответов: 758
Рейтинг: 112
|
|||
| карма: 1 |
| ||
| файлы: 1 | code_33615.txt [728B] [845] |
|
Главный модератор
Ответов: 3000
Рейтинг: 396
|
|||
|
Поправил
|
|||
| карма: 6 |
|
|
Ответов: 758
Рейтинг: 112
|
|||
|
Теперь непонятно как работает
Выше приведенная схема дает код code_33616.txt Почему не так code_33617.txt |
|||
| карма: 1 |
| ||
| файлы: 2 | code_33616.txt [564B] [719], code_33617.txt [435B] [811] |
|
Главный модератор
Ответов: 3000
Рейтинг: 396
|
|||
|
miver писал(а): Теперь непонятно как работаетКод экспериментальный - предлагайте свой вариант - рассмотрим и оставим лучший. |
|||
| карма: 6 |
|
|
Ответов: 758
Рейтинг: 112
|
|||
|
Nic, предлагаю такой вариант кода компонента Hub
code_33645.txt Если б можно было предварительно определить типы всех входных данных, то можно было бы не формировать процедуру для данных одного типа. То есть когда тип данных встречается только один раз. |
|||
| карма: 1 |
| ||
| файлы: 1 | code_33645.txt [1.1KB] [768] |
|
Главный модератор
Ответов: 3000
Рейтинг: 396
|
|||
| карма: 6 |
| ||
| файлы: 1 | code_33648.txt [875B] [809] |
|
Ответов: 758
Рейтинг: 112
|
|||
| карма: 1 |
| ||
| файлы: 1 | code_33649.txt [541B] [738] |
|
Главный модератор
Ответов: 3000
Рейтинг: 396
|
|||
|
Вот именно, хотя обычный Hub - вызывается трижды.
|
|||
| карма: 6 |
|
|
Ответов: 758
Рейтинг: 112
|
|||
|
Nic, можно ли вставлять код после вызова всех точек doEvent
Если да, то можешь подсказать как |
|||
| карма: 1 |
|
|
Главный модератор
Ответов: 3000
Рейтинг: 396
|
|||
|
miver писал(а): можно ли вставлять код после вызова всех точек doEvent?Для этого надо уметь определять какой вызов хаба последний, что, наверное, невозможно при рекурсивном обходе дерева элементов. |
|||
| карма: 6 |
|
|
Ответов: 4668
Рейтинг: 767
|
|||
|
Nic, так ты же добавил "финализирующий" метод в кодогенератор? В процессе работы компонента собирается вся нужная информация из doEvent, затем в "финале" генерируется окончательный код. Нет?
|
|||
| карма: 26 |
|



Поиск
Друзья
Администрация