Middle+
Compare la implementación de la programación orientada a objetos en Go y C#.
sobes.tech AI
Respuesta de la IA
En Go no hay herencia clásica orientada a objetos ni clases en el sentido tradicional. En su lugar, Go utiliza composición e interfaces.
Diferencias principales:
- Clases y objetos: C# se basa en clases, de las cuales se crean objetos. Go usa estructuras (structs), que pueden tener métodos.
- Herencia: C# soporta herencia simple y múltiple (a través de interfaces). Go soporta composición (inclusión de estructuras) y polimorfismo mediante interfaces.
- Interfaces: En C# las interfaces deben ser implementadas explícitamente por la clase. En Go, las interfaces se implementan implícitamente: si una estructura tiene métodos que coinciden con la firma de la interfaz, automáticamente la implementa.
- Visibilidad (Modificadores de acceso): En C# se usan
public,private,protected,internal. En Go, la visibilidad se determina por la primera letra del nombre: mayúscula, público; minúscula, privado (dentro del paquete). - Genéricos: C# tiene un sistema avanzado de genéricos. Go añadió soporte para genéricos a partir de la versión 1.18.
Ejemplo de composición en Go:
package main
import "fmt"
type Engine struct {
Type string
}
func (e Engine) Start() {
fmt.Printf("%s engine started!\n", e.Type)
}
type Car struct {
Model string
Engine // Inclusión anónima - composición
}
func main() {
myCar := Car{
Model: "Sedan",
Engine: Engine{
Type: "Petrol",
},
}
fmt.Printf("Car model: %s\n", myCar.Model)
myCar.Start() // Llamada al método de la estructura embebida
}
Ejemplo de implementación de interfaz en Go:
package main
import "fmt"
type Speaker interface {
Speak() string
}
type Dog struct{}
func (d Dog) Speak() string {
return "Woof!"
}
type Cat struct{}
func (c Cat) Speak() string {
return "Meow!"
}
func main() {
animals := []Speaker{Dog{}, Cat{}} // Slice de tipos que implementan la interfaz Speaker
for _, animal := range animals {
fmt.Println(animal.Speak())
}
}
En la tabla:
| Característica | Go | C# |
|---|---|---|
| Clases | No (hay estructuras) | Sí |
| Objetos | Instancias de estructuras | Instancias de clases |
| Herencia | Composición, interfaces | Clásica (simple), interfaces |
| Interfaces | Implementación implícita | Implementación explícita |
| Visibilidad | Primera letra en mayúscula | public, private, protected, etc. |
| Genéricos | Desde la versión 1.18 | Sí |
El enfoque de Go hacia la programación orientada a objetos es más descentralizado y se centra en el comportamiento (a través de interfaces) y en la estructura de datos (a través de la inclusión), lo que a menudo conduce a un código más flexible y fácil de probar. C# sigue un modelo más tradicional y jerárquico.