Представьте себе ситуацию, когда мы используем библиотеку, которая позволяет вам создавать Circle
объекты, где вы можете указать радиус и центр круга, чтобы определить его. Однако по какой-то причине он также принимает обязательный flavour
параметр. Теперь предположим, что мне действительно нужно использовать Circle
в моем собственном приложении, но для целей моего приложения я могу установить вкус Flavours.Cardboard
каждый раз.
Для того, чтобы «решить» это, я создаю свой собственный Circle
класс в другом пространстве имен, который только принимает radius
и в center
качестве параметров, но имеет неявный преобразователь к внешней библиотеке Circle
классу , который просто создает Circle(this.radius, this.center, Flavours.Cardboard)
объект. Поэтому везде, где мне нужен другой тип Circle
, я разрешаю автоматическое преобразование.
Каковы последствия создания такого класса? Есть ли лучшие решения? Будет ли иметь какое-то значение, если бы мое приложение было API, построенным поверх этой внешней библиотеки, предназначенной для использования другими программистами?
источник
MakeCircle
функцию ?makePlayer
аналогичную той, которая сама принимает только координаты для размещения игрока, но делегирует гораздо более сложный конструктор.Ответы:
Хотя это не всегда плохо, довольно редко неявные преобразования являются вашим лучшим вариантом.
Есть проблемы.
В общем, есть лучшие решения.
Лично я считаю, что №2 проще всего реализовать и наименее обременителен в дизайне. С другими могут быть все в порядке, учитывая ситуацию и то, что еще вы пытаетесь сделать с этими классами.
Неявное преобразование является последним средством, и оно мне действительно стоит того, когда у меня есть функторы стиля C ++, которые я пытаюсь создать - объекты стратегии, которые я неявно преобразую в типы делегатов.
источник
Учитывая сценарий, который вы описываете, вы можете думать об этом с точки зрения применения частичной функции.
Конструктор - это функция (по крайней мере, теоретически; в C # вы можете создать «фабричную функцию», которая вызывает конструктор):
для частичного применения достаточно:
Теперь вы можете получить свой конструктор, который требует только 2 параметра:
Итак, теперь у вас есть заводская функция с желаемыми параметрами
Кстати, это явно эквивалентно варианту 2 выше, просто с более функциональной точки зрения.
источник