Как же тогда отдать наружу результат работы, т.е. произвольный (из некоего набора) интерфейс?
Вид для печати
Как же тогда отдать наружу результат работы, т.е. произвольный (из некоего набора) интерфейс?
Есть несколько экземпляров функблоков "устройств", реализующих некоторые интерфейсы. Каждому экземпляру "устройства" присвоен уникальный индекс. Диспетчер интерфейсов должен получать индекс "устройства", интерфейс, который от этого "устройства" хочется получить, и, если "устройство" этот интерфейс реализует, возвращать его (интерфейс). Ну а если не реализует -- как либо сообщать об ошибке.
Давайте определимся - что значит "возвращать интерфейс"? Что лично для вас означает термин "интерфейс" в контексте решаемой задачи?
Сразу уточню - я не издеваюсь, не пытаюсь придраться к словам и т.д.
Просто вы сейчас задаете вопросы из области, где терминология предельно важна, и мне надо очень четно понимать ваше представление о ней.
Интерфейс -- это https://help.codesys.com/webapp/_cds...rsion=3.5.17.0 в терминах среды кодсиса.
Я хотел сделать что-то вроде аналога оператора __QUERYINTERFACE, или, может быть, точнее будет назвать это фабрикой интерфейсов.
Интерфейс - это тип данных. Его нельзя вернуть в вызове POU. Можно вернуть экземпляр конкретного интерфейса.
Экземпляр интерфейса - это ссылка на экземпляр ФБ, реализующего данный конкретный интерфейс.
Экземпляр какого интерфейса вы хотите возвращать в вызове своей "фабрики"?
Судя по предыдущим постам (поправьте меня, пожалуйста, если я неверно вас понял) - произвольного.
Но что значит "экземпляр произвольного интерфейса" в контексте языка со статической типизацией?
Можно сказать (и мы уже это обсуждали), что экземпляры интерфейсов, передаваемые оператору __QUERYINTERFACE, должны наследовать системный интерфейс __SYSTEM.IQueryInterface.
И действительно - можно реализовать POU, который будет возвращать экземпляр такого типа. Т.е. на выходе вы получите ссылку на экземпляр ФБ, который реализует __SYSTEM.IQueryInterface.
Какому объекту вы передадите значение этого выхода? Опять же, типизация статическая - т.е. только другому объекту данного типа.
Соответственно, вы получите ссылку на экземпляр ФБ, реализующего __SYSTEM.IQueryInterface.
Что предполагается делать с ним дальше? У __SYSTEM.IQueryInterface нет публичных методов.
__QUERYINTERFACE - это системный оператор, реализованный крайне специфичным образом и функционирующий именно так, как было задумано его создателями.
Если вам интересно мое мнение - то я бы рекомендовал использовать его, а не пытаться разработать "аналог".
> Можно вернуть экземпляр конкретного интерфейса
Да, предполагалось, что будет объявлен экземпляр определённого интерфейса (занулённый), затем передан фабрике вместе с индексом "устройства", предположительно реализующего подобный интерфейс. Если "устройство" действительно реализует интерфейс такого типа, то переданный экземпляр интерфейса инициализируется этим "устройством", если нет -- остаётся равным нулю. Набор интерфейсов, которые может создавать фабрика, конечно, фиксированный.
Идея была в том, чтобы каждое "устройство" не знало про остальных ничего, кроме уникального индекса, и, предположительно, интерфейса, который может быть реализован по этому индексу.
Т.е. из "устройства" выполняется запрос к фабрике интерфейсов, отдаётся ей уникальный индекс, и экземпляр интерфейса, предположительно реализуемый "устройством" с таким индексом. А фабрика, если по индексу реализован запрашиваемый интерфейс, инициализирует его.
В моем понимании "инициализация экземпляра интерфейса" - это присвоение ему экземпляра ФБ, реализующего это интерфейс.Цитата:
А фабрика, если по индексу реализован запрашиваемый интерфейс, инициализирует его.
Где (в каком POU вашего проекта) на ваш взгляд должен быть объявлен этот экземпляр ФБ?