Сценарий:
(Если кто-то недавно отвечал / просматривал мои вопросы, это будет несколько знакомо)
У меня есть 3 разных веб-сервиса, которые предоставляют набор общих объектов. Я написал классы-оболочки и логику преобразования, используя общие методы для переключения между промежуточными объектами и объектом службы.
У меня есть интерфейс для веб-сервиса, пусть он будет называться IService для целей этого вопроса. У меня есть 3 класса реализации Service1Impl, Service2Impl и Service3Impl. Каждый из них ссылается на другую веб-службу и использует мои вышеупомянутые общие методы для преобразования между соответствующими объектами.
Они вводятся в мой класс ServiceWrapper во время выполнения через конструктор (фабрика используется для создания подходящей реализации ISerivice
например:
_service = ServiceWrapper.GetServiceWrapper("2");
Дает мне ServiceWrapper, созданный с помощью Service2Impl.
(Черт возьми, диаграммы были бы чертовски полезны!)
Итак, каждая реализация IService имеет метод, вызываемый ради аргументов .. GetProperties:
public IProperty[] GetProperties(string item, IProperty[] properties)
{
Property[] props = ServiceObjectFactory.CreateProperties<Property>(properties);
Property[] result = _service.GetProperties(item, props);
return ServiceObjectFactory.CreateProperties(result);
}
Это выглядит немного запутанным (думаю, я собираюсь реорганизовать имена).
В основном происходит следующее:
Вызов этой функции из ServiceWrapper осуществляется с помощью промежуточных объектов (IProperty) (как видно из параметров).
Промежуточные объекты преобразуются в объекты Property, специфичные для службы.
Результат возвращается в виде объектов Property, специфичных для службы.
Результат преобразуется в промежуточные объекты перед передачей обратно в ServiceWrapper.
Теперь этот код будет точно таким же для Service1Impl, Service2Impl и Service3Impl. За исключением, конечно, того, что используемые типы различны.
Может ли кто-нибудь придумать способ сделать это, чтобы у меня не было одного и того же кода 3 раза?
Примечание. Это не относится ко всем методам в каждой реализации. Просто большинство из них.





Я не уверен, подходит ли это к вашему сценарию, но я вспоминаю, читая ваш вопрос Инверсия контроля.
Я думаю, что в целом, если вы хотите, чтобы ваш код имел разные сигнатуры типов, вам придется писать код три раза. Поскольку типы разные, это совсем не «один и тот же код».
Вы можете поместить то, что у вас есть, в унаследованный метод, а затем обернуть результаты в каждый подкласс.