Desde menos es exponencialmente más
Si C ++ y Java tratan sobre jerarquías de tipos y la taxonomía de los tipos, Go trata sobre la composición.
programming-languages
go
composition
CMinus
fuente
fuente
Esta pregunta / problema es similar a este .
En Go, realmente no tienes OOP.
Si desea "especializar" un objeto, hágalo incrustando, que es una composición, pero con algunas ventajas que lo hacen parcialmente similar a la herencia. Lo haces así:
En este ejemplo, ConnexionMysql es un tipo de especialización de * sql.DB, y puede llamar a ConnexionMysql las funciones definidas en * sql.DB:
Entonces, a primera vista, podría pensar que esta composición es la herramienta para hacer su taxonomía habitual.
Pero
si una función definida en * sql.DB llama a otras funciones definidas en * sql.DB, no llamará a las funciones redefinidas en ConnexionMysql, incluso si existen.
Con la herencia clásica, a menudo haces algo como esto:
Es decir, usted define
doComplexThing
en la superclase como una organización en llamadas de especializaciones.Pero en Go, esto no llamaría a la función especializada sino a la función de "superclase".
Entonces, si desea tener un algoritmo que necesite llamar a algunas funciones definidas en * sql.DB pero redefinidas en ConnexionMySQL (u otras especializaciones), no puede definir este algoritmo como una función de * sql.DB, pero debe definirlo en otro lugar y esta función solo compondrá las llamadas a la especialización proporcionada.
Podrías hacerlo así usando interfaces:
Esto es bastante diferente de la anulación clásica de las jerarquías de clases.
Especialmente, obviamente no puede tener directamente un tercer nivel heredando una implementación de función del segundo.
En la práctica, terminará utilizando principalmente interfaces (ortogonales) y dejará que la función componga las llamadas en una implementación proporcionada en lugar de que la "superclase" de la implementación organice esas llamadas.
En mi experiencia, esto lleva a la ausencia práctica de jerarquías más profundas que un nivel.
Con demasiada frecuencia, en otros idiomas, tiene el reflejo, cuando ve que el concepto A es una especialización del concepto B, para reificar este hecho creando una clase B y una clase A como una subclase de B. En lugar de crear su programa alrededor de sus datos, pasa tiempo reproduciendo la taxonomía de objetos en su código, en el principio de que esto es realidad.
En Go no puede definir un algoritmo general y especializarlo. Debe definir un algoritmo general y asegurarse de que sea general y funcione con las implementaciones de interfaz proporcionadas.
Habiendo quedado horrorizado por la creciente complejidad de algunos árboles de jerarquía en los que los codificadores estaban haciendo trucos complejos para tratar de acomodar un algoritmo cuya lógica finalmente implica todos los niveles, diría que estoy contento con la lógica Go más simple, incluso si obliga pensar en lugar de simplemente reificar los conceptos de su modelo de aplicación.
fuente