metaclass: (Default)
[personal profile] metaclass
Обдумываю одну рабочую шизу и есть там один момент - нужно создавать объекты, реализующие один и тот же интерфейс, но немного отличающиеся. Самое простое решение - это передать функцию, которая из параметров создаст нужный объект и вернет его. То бишь фабрику. В связи с этим меня начало плющить: а зачем в дополнение к конструктору объекта еще создавать и статический метод-фабрику, если они делают одно и то же? Но при этом метод можно передать в виде функции, а конструктор нельзя.

Date: 2010-07-13 02:03 pm (UTC)
From: [identity profile] osdm.livejournal.com
Какой язык? Есть туева хуча вариантов.

На Дельфи. Можно сделать базовый класс, в котором описать конструктор с нужными параметрами, остальные классы от него унаследовать. Передавать объект специального типа class of базовый класс.

На JavaScript. Конструктор - обычная функция, передавай и вызывай как хочешь.

На C++, C# и прочих Java. Есть паттерн Clone. Делаем в интерфейсе метод Clone, который возьмет на вход нужные параметры и сделает объект такого же класса, как и текущий. Передаем специальный "пустой" инстанс нужного класса, из которого искомый код делает что нужно.

Вариант, которым бы воспользовался я (на C# и Java). У нужных классов делаем пустой конструктор + специальный метод Initialize, берущий на вход нужные параметры и выполняющий роль настоящего конструктора. В код передаем Type, полученный через typeof. В коде через reflection создаем экземпляр класса, приводим его к нужному интерфейсу и вызываем метод. Как вариант - оформляем код в качестве generic-метода, а тип - в качестве generic параметра с констрейнтами на интерфейс и на new(), в этом случае рефлекшн и приведение к интерфейсу не понадобятся.

Ну, конечно же, вариант с передачей функции. Возможно, я не испорчен функциональным программированием, но этот вариант мне чем-то не нравится, хотя объяснить не могу.

Date: 2010-07-13 03:30 pm (UTC)
From: [identity profile] metaclass.livejournal.com
На дельфи я так и делал, да.
На С# - передаю функцию, там это безальтернативный способ параметризации, а уж если нужно замыкание каких-то дополнительных параметров, так и вообще.

Рефлекшн стараюсь использовать по минимуму, оно вызывает ощущение что я из C# делаю питон :)

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 24th, 2025 03:34 am
Powered by Dreamwidth Studios