Как я могу использовать метод .getServicedEntity () для Resource Unit без преобразования типа агента? - PullRequest
0 голосов
/ 08 мая 2020

Я создал настраиваемый блок, который, помимо прочего, сообщает ресурсу, входящему в portIn блока, перейти в блок захвата ресурса. Я использую блок moveTo с целевым узлом как: (Node)((Cart)agent).getServicedEntity().getNetworkNode();, но мне нужно знать тип агента и передать его в метод. Я хотел бы сделать этот блок c общим, который можно использовать в других моделях и с любой единицей ресурсов.

Я пробовал использовать общие c параметры в настраиваемом блоке

enter image description here

, затем выберите тип агента:

enter image description here

и затем попробуйте: (Node)T.getServicedEntity().getNetworkNode(); но это приводит к ошибке компиляции: Метод getServicedEntity () не определен для типа T. Есть ли способ сделать то, что я хочу сделать? Я в порядке, если пользователь должен выбрать тип агента с помощью раскрывающегося списка параметров generi c, но я бы хотел избежать необходимости каждый раз изменять код для добавления всех типов ресурсов, доступных в модели, с помощью instanceof , а затем скопируйте код. Кажется неэффективным.

1 Ответ

0 голосов
/ 09 мая 2020

Ну, ваша "Т" расширяет Agent, а Agent не знает про getServicedEntity.

То, что расширяет ваш T, должно знать, что это ресурсная единица. Самое простое решение, которое я вижу:

  1. Создайте родительский класс MyResourceUnit (но не создавайте его экземпляр)
  2. Убедитесь, что он «используется в блок-схемах в качестве единицы ресурса» enter image description here
  3. Сделать все типы агентов, которые должны когда-либо использовать ваш настраиваемый блок для расширения MyResourceUnit enter image description here
  4. Теперь в настраиваемом блоке вы должно составить T extends MyResourceUnit
...