La palabra polimorfismo significa tener muchas formas. O en otras palabras, podemos definir el polimorfismo como la capacidad de un mensaje para mostrarse en más de una forma. O, en términos técnicos, polimorfismo significa el mismo nombre de método (pero diferentes firmas) que se usa para diferentes tipos. Por ejemplo, una mujer al mismo tiempo puede tener diferentes características. Como una madre, una esposa, una hermana, un empleado, etc. Entonces, la misma persona posee un comportamiento diferente en diferentes situaciones. Esto se llama polimorfismo.
En el lenguaje Go, no podemos lograr el polimorfismo con la ayuda de clases porque el lenguaje Go no admite clases, pero puede lograrlo mediante el uso de interfaces .. Como ya sabemos, las interfaces están implícitamente implementadas en Go. Entonces, cuando creamos una interfaz y otros tipos quieren implementar esa interfaz, esos tipos usan esa interfaz con la ayuda de los métodos definidos en la interfaz sin conocer el tipo. En una interfaz, una variable de un tipo de interfaz puede contener cualquier valor que implemente la interfaz. Esta propiedad ayuda a las interfaces a lograr polimorfismo en el lenguaje Go. Analicemos con la ayuda de un ejemplo:
Ejemplo:
// Go program to illustrate the concept // of polymorphism using interfaces package main import "fmt" // Interface type employee interface { develop() int name() string } // Structure 1 type team1 struct { totalapp_1 int name_1 string } // Methods of employee interface are // implemented by the team1 structure func (t1 team1) develop() int { return t1.totalapp_1 } func (t1 team1) name() string { return t1.name_1 } // Structure 2 type team2 struct { totalapp_2 int name_2 string } // Methods of employee interface are // implemented by the team2 structure func (t2 team2) develop() int { return t2.totalapp_2 } func (t2 team2) name() string { return t2.name_2 } func finaldevelop(i []employee) { totalproject := 0 for _, ele := range i { fmt.Printf("\nProject environment = %s\n ", ele.name()) fmt.Printf("Total number of project %d\n ", ele.develop()) totalproject += ele.develop() } fmt.Printf("\nTotal projects completed by "+ "the company = %d", totalproject) } // Main function func main() { res1 := team1{totalapp_1: 20, name_1: "Android"} res2 := team2{totalapp_2: 35, name_2: "IOS"} final := []employee{res1, res2} finaldevelop(final) }
Producción:
Project environment = Android Total number of project 20 Project environment = IOS Total number of project 35 Total projects completed by the company = 55
Explicación: En el ejemplo anterior, tenemos un nombre de interfaz como empleado. Esta interfaz contiene dos métodos, es decir, el método de desarrollo() y nombre() , aquí, el método de desarrollo() devuelve el número total de proyectos y el método de nombre() devuelve el nombre del entorno en el que se desarrollan.
Ahora tenemos dos estructuras, es decir, team1 y team2 . Ambas estructuras contienen dos o dos campos, es decir, totalapp_1 int , name_1 string , totalapp_2 int y name_2 string . Ahora, estas estructuras (es decir, equipo1 y equipo2 ) están implementando los métodos de la interfaz de empleado.
Después de eso, creamos una función llamada finaldevelop() que devuelve el número total de proyectos desarrollados por la empresa. Acepta una porción de las interfaces de los empleados como argumento y calcula el número total de proyectos desarrollados por la empresa iterando sobre el método de porción y llamada a desarrollar() en cada uno de sus elementos. También muestra el entorno del proyecto llamando al método name() . De acuerdo con el tipo concreto de la interfaz de empleado, se llamarán a diferentes métodos de desarrollo() y nombre() . Entonces, logramos el polimorfismo en la función finaldevelop() .
Si agrega otro equipo en este programa que implementa la interfaz de empleado, esta función finaldevelop() calculará el número total de proyectos desarrollados por la empresa sin ningún cambio debido al polimorfismo.
Publicación traducida automáticamente
Artículo escrito por ankita_saini y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA