Страница 1 из 1

Полиморфный VI при помощи входного enum-переключателя

Добавлено: 11 мар 2020, 20:22
dakishi
Добрый вечер!

У меня несколько раз в программе используются разные SubVI которые делают почти одно и то же - я передаю ссылку на файл
в SubVI, с ним производятся определенные операции и подается на выход кластер с результатами. Отличие в том, что с разными файлами разные операции нужно делать, но везде на выходе некоторый кластер.
Мне хотелось бы создать SubVI, который принимая одну ссылку на файл и команду enum (что с ним делать) на выход выдавал бы соответственно разные кластеры с результатами. Это можно сделать ?

PS пробовал с variant, но как то сложно получается - во внешней программе нужно указать тип кластера и это занимает много дополнительного места на блок диаграмме.

Re: Полиморфный VI при помощи входного enum-переключателя

Добавлено: 11 мар 2020, 22:02
Artem.spb
А какой результат вы ожидаете?
Пока на выходе "какой-то" кластер, всё будет "сложно".
Или унифицируйте кластер, или делайте тот самый полиморфный, но в качестве переключателя будет выбор полиморфа снизу. Пока функция одна и та же, она не сможет выдать вам разные результаты в зависимости от входного параметра (кроме Variant, который вы отметаете)

Re: Полиморфный VI при помощи входного enum-переключателя

Добавлено: 11 мар 2020, 22:21
Юрий
dakishi, Мне хотелось бы создать SubVI, который принимая одну ссылку на файл и команду enum (что с ним делать) на выход выдавал бы соответственно разные кластеры с результатами. Это можно сделать ?
Можно, если этот VI будет иметь столько выходов, сколько вариантов кластеров.

Re: Полиморфный VI при помощи входного enum-переключателя

Добавлено: 11 мар 2020, 22:59
Kosist
Начиная с :labview: 2017 для этой цели можно использовать malleable VIs.
Ну, или решить это при помощи классов.

Re: Полиморфный VI при помощи входного enum-переключателя

Добавлено: 12 мар 2020, 10:35
Vitekkz88
Мне хотелось бы создать SubVI, который принимая одну ссылку на файл и команду enum (что с ним делать) на выход выдавал бы соответственно разные кластеры с результатами. Это можно сделать ?
Если у вас одна функция отличается от другой только операцией суммирования(например) - это уже две разные функции. В этом случае Вам нужно архитектурно подумать над приложением: объединить повторяющиеся части и вынести отличия за пределы. Но и в этом случае нужно подумать: а не случится ли так, что сегодня это общие части, а завтра это должны быть две разные и независимые части?
Если бы Вы делали это с помощью классов - то Вам бы пришлось создавать набор классов и методов. Да, некоторые методы бы отличались всего одной операцией, однако их принадлежность к классу бы играла ключевую роль. Так что не парьтесь особо, если в case-структуре у вас будет N команд и для каждой будет своя функция.
Создайте общий кластер из всех нужных полей и работайте с ним: пишите/читайте значения полей где будет удобно и когда нужно. Если полей много, то группируйте их между собой в отдельные кластеры, но в итоге так же работайте с общим кластером. Делайте кластеры как typedef, это поможет на этапах сопровождения доработок.

Re: Полиморфный VI при помощи входного enum-переключателя

Добавлено: 12 мар 2020, 14:51
Artem.spb
[quote=="Kosist"]Ну, или решить это при помощи классов.[/quote]
Как классы помогут сделать одинаковые функции с разными выходами?
Если только выходное значение - это элемент класса

Re: Полиморфный VI при помощи входного enum-переключателя

Добавлено: 15 мар 2020, 17:25
Kosist
Для разных выходов свой accessor будет в таком случае, т.е. сама функция выхода не должна иметь.
При любой имплементации, будет место в программе где будет использоваться конкретное выходное значение - если все делать классами, то в этом моменте будет вызываться accessor конкретного класса.