|
| 1 | +package main |
| 2 | + |
| 3 | +import ( |
| 4 | + "fmt" |
| 5 | +) |
| 6 | + |
| 7 | +/* |
| 8 | +En 'Golang' no existe la herencia como en otros lenguajes, pero existe la composición. |
| 9 | +Esto no es un problema de diseño, el lenguaje está diseñado de esta manera |
| 10 | +en parte para evitar las jerarquías de tipo y evitar realizar un sobrediseño temprano en la solución. |
| 11 | +así evitamos hacerla más compleja(pero no más funcional). |
| 12 | +
|
| 13 | +Composición: Facil de testear, DI/DIP(Inyección de dependencias/Principio de inversión de dependencias). |
| 14 | +Golang nos ofrece caracteristicas que van más allá: |
| 15 | +- Métodos que pueden usarse en diferentes tipos declarados.(maps, structs, slices, y otros tipos) |
| 16 | +- Interfaces implicitas: No necesitamos usar la palabra reservada 'Implements', ya que golang verifica si nuesto tipo |
| 17 | +tiene los métodos que requiere la interface y esto es muy util ya que varios tipos puenden satisfacer a una interface |
| 18 | +y no hace falta especificar que el tipo 'X' implementa a las interfaces '1', '2', '3', etc... |
| 19 | +- Incrustación de cammpos: Permite integrar tipos en otros tipos y esto no es analogo a las clases, pero no es idéntico. |
| 20 | +
|
| 21 | +Golang no posee las funciones setter y getter aunque estas se pueden diseñar de manera simple com métodos. |
| 22 | +
|
| 23 | +Tipos: En golang existen muchos tipos; como los predeclarados: string, float, int, etc... |
| 24 | +también los tipos compuestos como los arreglos, maps, slice, estructs, etc... |
| 25 | +Pero adicionalmente existen tipos compuestos, estos tienen ciertas condiciones como ser referenciados en el mismo |
| 26 | +paquete en que los declaramos. |
| 27 | +por eso no podemos añadir funcionalidades a los tipos predeclarados, pero lo que si podemos es construir un nuevo tipo a partir de uno |
| 28 | +predeclarado y añadirle nuevas funcionalidades |
| 29 | +
|
| 30 | +Golang tampoco posee sobreescritura de métodos, en cambio tiene ocultación de métodos, aunque hay que tener cuidado cone esto |
| 31 | +porque pueden generarse conflictos. |
| 32 | +
|
| 33 | +por ejemplo cuando tienes un capo de nombre en dos estructuras "Humano y Empleado" y embebemos empleado en humano para obtener sus métodos |
| 34 | +y atributos, puede haber conflicto al llamar el nombre, esto se soluciona llamando el nombre espesificando si lo queremos de la clase humano o |
| 35 | +la clase empleado. |
| 36 | +
|
| 37 | +fmt.Println(e.Human.age) o fmt.Println(e.Employee.age) dependiendo desde de clase se requiera. |
| 38 | +*/ |
| 39 | + |
| 40 | +// newBool nuevo tipo a partir de un tipo predeclarado |
| 41 | +type newBool bool |
| 42 | + |
| 43 | +// String es el método de un nuevo tipo a partir de uno predeclarado |
| 44 | +func (b newBool) String() string { |
| 45 | + if b { |
| 46 | + return "VERDADERO" |
| 47 | + } |
| 48 | + return "FALSO" |
| 49 | +} |
| 50 | + |
| 51 | +// Composición de estructuras. |
| 52 | +// character es una clase padre |
| 53 | +type character struct { |
| 54 | + name string |
| 55 | + race string |
| 56 | + atack bool |
| 57 | +} |
| 58 | + |
| 59 | +// animal es la clase padre |
| 60 | +type animal struct { |
| 61 | + animalType string |
| 62 | + sound string |
| 63 | +} |
| 64 | + |
| 65 | +// sound es método de la clase padre animal |
| 66 | +func (a animal) makeSound() { |
| 67 | + fmt.Println(a.animalType, " dice: ", a.sound) |
| 68 | +} |
| 69 | + |
| 70 | +// instancias con asignación directa de la clase padre "animal" |
| 71 | +var cat = animal{animalType: "Gato", sound: "Miau"} |
| 72 | +var dog = animal{animalType: "Perro", sound: "Guau"} |
| 73 | + |
| 74 | +// NewCharacter es el constructor de caracteres |
| 75 | +func NewCharacter(name, animalType string, atack bool) character { |
| 76 | + return character{name, animalType, atack} |
| 77 | +} |
| 78 | + |
| 79 | +// Extra |
| 80 | + |
| 81 | +// employee es la clase padre del ejercio extra |
| 82 | +type employee struct { |
| 83 | + id int |
| 84 | + name string |
| 85 | + position string |
| 86 | +} |
| 87 | + |
| 88 | +// manager es una subclase de empleado |
| 89 | +type manager struct { |
| 90 | + employee |
| 91 | + employees []employee |
| 92 | +} |
| 93 | + |
| 94 | +// projectManager es una subclase de empleado |
| 95 | +type projectManager struct { |
| 96 | + manager |
| 97 | + projects []string |
| 98 | +} |
| 99 | + |
| 100 | +// programmer es la subclase de empleado |
| 101 | +type programmer struct { |
| 102 | + employee |
| 103 | + languages []string |
| 104 | +} |
| 105 | + |
| 106 | +func main() { |
| 107 | + monster := NewCharacter("Golg", "Dragon", true) |
| 108 | + fmt.Println("Nombre: ", monster.name) |
| 109 | + fmt.Println("Raza: ", monster.race) |
| 110 | + fmt.Println("¿Ataca?: ", monster.atack) |
| 111 | + |
| 112 | + // Método impresor de sonido de los nimales |
| 113 | + cat.makeSound() |
| 114 | + dog.makeSound() |
| 115 | + |
| 116 | + // Extra |
| 117 | + employee1 := employee{id: 1, name: "Miguel", position: "Programmer"} |
| 118 | + employee2 := employee{id: 2, name: "Ricardo", position: "Manager"} |
| 119 | + employee3 := employee{id: 3, name: "Vicente", position: "Project Manager"} |
| 120 | + manager1 := manager{employee: employee1, employees: []employee{employee2, employee3}} |
| 121 | + projectManager1 := projectManager{manager: manager1, projects: []string{"Project 1", "Project 2"}} |
| 122 | + programmer1 := programmer{employee: employee1, languages: []string{"Go", "Python", "Java"}} |
| 123 | + programmer2 := programmer{employee: employee3, languages: []string{"Java", "C#"}} |
| 124 | + |
| 125 | + fmt.Println("Employee 1: ", employee1) |
| 126 | + fmt.Println("Employee 2: ", employee2) |
| 127 | + fmt.Println("Employee 3: ", employee3) |
| 128 | + fmt.Println("Manager 1: ", manager1) |
| 129 | + fmt.Println("Project Manager 1: ", projectManager1) |
| 130 | + fmt.Println("Programmer 1: ", programmer1) |
| 131 | + fmt.Println("Programmer 2: ", programmer2) |
| 132 | + |
| 133 | + // nuevo tipo a partir de uno predeclarado y con nueva funcionalidad(Simple) |
| 134 | + var b newBool = true |
| 135 | + fmt.Println(b.String()) |
| 136 | + b = false |
| 137 | + fmt.Println(b.String()) |
| 138 | + |
| 139 | +} |
0 commit comments