Sobes.tech
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)
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

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.