Imagine una situación en la que estamos usando una biblioteca que le permite crear Circle
objetos, donde puede especificar el radio y el centro del círculo para definirlo. Sin embargo, por alguna razón, también toma un flavour
parámetro requerido . Ahora digamos que realmente necesito usar Circle
mi propia aplicación, pero para los fines de mi aplicación puedo configurar el sabor para que sea Flavours.Cardboard
cada vez.
Para "resolver" esto, creo mi propia Circle
clase en un espacio de nombres diferente, que solo toma radius
y center
como parámetros, pero tiene un convertidor implícito a la Circle
clase 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
MakeCircle
función ?makePlayer
que 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