Imagine una situación en la que estamos usando una biblioteca que le permite crear Circleobjetos, donde puede especificar el radio y el centro del círculo para definirlo. Sin embargo, por alguna razón, también toma un flavourparámetro requerido . Ahora digamos que realmente necesito usar Circlemi propia aplicación, pero para los fines de mi aplicación puedo configurar el sabor para que sea Flavours.Cardboardcada vez.
Para "resolver" esto, creo mi propia Circleclase en un espacio de nombres diferente, que solo toma radiusy centercomo parámetros, pero tiene un convertidor implícito a la Circleclase de la biblioteca externa que simplemente crea un Circle(this.radius, this.center, Flavours.Cardboard)objeto. Entonces, donde sea que necesite el otro tipo de Circle, dejo que la conversión automática tenga lugar.
¿Cuáles son las consecuencias de crear tal clase? ¿Hay alguna solución mejor? ¿Habría alguna diferencia si mi aplicación fuera una API construida sobre esta biblioteca externa, destinada a ser utilizada por otros programadores?
fuente

MakeCirclefunción ?makePlayerque solo acepta las coordenadas para colocar al jugador, pero delega en un constructor mucho más complejo.Respuestas:
Si bien no siempre es malo, es bastante raro que las conversiones implícitas sean su mejor opción.
Hay problemas
En general, hay mejores soluciones.
Personalmente, considero que el n. ° 2 es el más sencillo de implementar y el menos gravoso en el diseño. Los demás pueden estar bien, dada la situación y qué más está tratando de hacer con estas clases.
La conversión implícita es un último recurso, y solo me parece que realmente vale la pena cuando tengo functores de estilo C ++ que estoy tratando de hacer: objetos de estrategia que convierto implícitamente en tipos de delegado.
fuente
Dado el escenario que está describiendo, puede pensar en esto en términos de aplicación de función parcial.
Un constructor es una función (al menos en teoría; en C #, puede crear una "función de fábrica" que llama al constructor):
para aplicación parcial, lo siguiente será suficiente:
Ahora puede obtener su constructor que solo requiere 2 parámetros:
Entonces ahora tiene una función de fábrica con sus parámetros deseados
Por cierto, esto es claramente equivalente a la opción 2 anterior, solo desde una perspectiva más funcional.
fuente