Как привести методы с разными параметрами к единому интерфейсу?
Есть два класса-генератора, например URL'ов. Хочется сделать так, чтобы они реализовывали единый интерфейс и вызывающему коду было без разницы с каким генератором он работает - вызвал метод, получил URL.
Проблема в следующем: для одного и того же метода одному классу требуется чуть больше данных, чем другому. Как разрулить эту ситуацию?
Делать избыточное количество параметров в сигнатуре функции и затем игнорировать их там, где они не нужны как-то не очень. Паттерн адаптер тут тоже не подходит, т.к данные должны приходить извне, а адаптеру придется где-то их самостоятельно получать. Если создавать какой-то абстрактный объект параметров (или массив), то в вызывающем коде нарушается инкапсуляция - нужно знать для чего конкретно мы собираем объект.
Есть еще какие-то варианты, или я уже все перечислил? :)
Андрей: вариант 3 - сделать виртуальным метод вызова, не уверен, что подходит в данном случае.
Интересная проблема, не видно вообще кода, возможно проблема в другом месте,
Не забудьте отписаться, на чем в итоге остановитесь.
Андрей: В любом случае мало информации =)
Не ясно что данные,откуда приходят. Вроде хотите сделать интерфейс для генератора,с другой стороны разные данные,то есть они сами как-то должны прийти по-разному. То есть нет того, о чем писали - "инкапсуляции"
Правильно ли я понял:
у вас есть класс А, который содержит N параметров.
есть класс Construct_1, который делает что то на основе M параметров, где M - подмножество N
есть класс Construct_2, который делает что то, похожее на действия Construct_1 на основе M` параметров, где M` - подмножество N.
Вы хотите чтобы C_1 и C_2 были объединены одним интерфейсом. Т.е. кто то извне создает С_1 или С_2 в зависимости от условий, передает его например в A, и A вызывает общий метод, давая туда нужные данные, но не зная что перед ним - Construct_1 или Construct_2?
Да! Именно это я и имею ввиду. Спасибо, с Вашим примером гораздо лучше )
Причем класс A не обязательно содержит все эти N параметров, он может "знать" где можно получить нужные нам значения. Причем конечно с таким же успехом эти значения можно было бы получать в C_1 и C_2, тогда и параметры то не нужны бы стали. Но я бы хотел, чтобы классы были максимально абстрагированы от контекста их выполнения.
Андрей Дык я просто переписал ваш текст - решения я не привел ) По сути. Делаете интерфейс DataProvider. В нем - туча методов, которыми можно получить все данные для M и для M` - для обоих, это важно. Реализуете интерфейс в A. Далее - делаете интерфейс Generator. В нем - один метод Generate, который принимает в себя DataProvider. Ну и реализуете Generator в C_1 и C_2. Таким образом у вас нужные реализации будут запрашивать нужные данные из DataProvider, коим может являться ваш А. А может быть и кто то другой.
GavriKos: ну да, что-то подобное я имел в виду когда говорил про передачу объекта в качестве параметра метода. Ваш пример чуть чуть другой и вполне мог бы подойти в данной ситуации, спасибо!