порядка 10 служб доставки, для каждой службы доставки есть клас TDeliveryServices_A_ApiClient = class
TDeliveryServices_B_ApiClient = class TDeliveryServices_C_ApiClient = class
в каждом классе есть месть метод get_tracking_number_status(Atracking_number:string):string;
который возвращает статус отправления по трек номеру. Есть таблица DELIVERY_SERVICES в базе c службами доставки.
ID|NAME|API_KEY|........
как елегантно зеализовать.
if DELIVERY_SERVICES.ID=2 then delivery_service:=TDeliveryServices_A_ApiClient .Create();
.......
.......
if DELIVERY_SERVICES.ID=10 then delivery_service:=TDeliveryServices_C_ApiClient .Create();
.......
.......
без кучи if ?
Смотри в сторону фабрики, через case
Завести словарь классов. Ключ это ID, value - class. Все классы зарегистрировать в этом словаре при запуске программы. Сами классы могут быть реализованы в разных модулях. Будут доступны только методы базового класса и виртуальные методы. Пример есть в модуле Graphics.
1) Как Дмитрий Логинов подсказал. 2) Каждый класс имеет классовое поле/метод со своим ID, регистрировать классы в *любом* контейнере и искать по нему, Вариант 1 когда нет словаря. 3) RTTI, в DELIVERY_SERVICES в поле Name писать имя класса. Получать класс по имени и создавать экземпляр. 4) APISHIP и подобное, и вообще не париться со множеством служб. https://softfinder.ru/services/treking-zakazov
А value такого класса какого типа будут?
TBaseDeliveryServices TDeliveryServices_A_ApiClient (TBaseDeliveryServices) TDeliveryServices_B_ApiClient (TBaseDeliveryServices) dict := TDictionary<Integer, TBaseDeliveryServices>.Create; dict.TryAdd(1, TDeliveryServices_A_ApiClient); dict.TryAdd(2, TDeliveryServices_B_ApiClient);
Подскажите пожалуйста как потом с дикта по key выполнить метод
Обсуждают сегодня