Sobes.tech
Junior

¿Cuál es la similitud y la diferencia entre una clase normal y una clase abstracta?

sobes.tech AI

Respuesta de la IA

En Golang no existe el concepto de "clase normal" y "clase abstracta" en la forma en que existen en lenguajes orientados a objetos como Java o C#.

Sin embargo, su funcionalidad se puede imitar utilizando estructuras e interfaces.

Similitudes (usando estructuras e interfaces en Golang):

  • Estado (datos): La estructura puede contener campos, como una clase normal que almacena propiedades.
  • Comportamiento (métodos): Se pueden adjuntar métodos a la estructura, que definirán su comportamiento, similar a los métodos de una clase normal.
  • Contrato común (para clase abstracta e interfaz): La interfaz en Golang define un conjunto de métodos que cualquier estructura que "implemente" esa interfaz debe definir. Esto es similar a cómo una clase abstracta o interfaz en otros lenguajes establece un contrato para las clases que heredan o implementan.

Diferencias (en el contexto de Golang):

Característica "Clase normal" (estructura con métodos) "Clase abstracta" (interfaz + estructuras)
Creación directa Se puede crear una instancia de la estructura. No se puede crear una instancia de la interfaz.
Implementación de métodos Todos los métodos adjuntos a la estructura tienen implementación. La interfaz solo declara métodos, pero no su implementación.
Herencia No hay herencia clásica explícita. Se puede usar composición (inclusión de estructuras). La interfaz no hereda, sino que las estructuras la implementan.
Obligatoriedad de implementación No hay obligación de implementar un conjunto específico de métodos, aparte de los adjuntos a la estructura. Cualquier estructura que "implemente" la interfaz de Golang debe proporcionar la implementación de todos sus métodos.
Almacenamiento de estado (campos) La estructura puede contener campos de datos. La interfaz no contiene campos de datos.

Ejemplo de imitación:

// interfaz que imita una clase abstracta
type Shape interface {
	Area() float64
	Perimeter() float64
}

// estructura que imita una clase normal
type Circle struct {
	Radius float64
}

// implementación de los métodos de la interfaz para Circle
func (c Circle) Area() float64 {
	return 3.14 * c.Radius * c.Radius
}

func (c Circle) Perimeter() float64 {
	return 2 * 3.14 * c.Radius
}

// Otra estructura que implementa la interfaz
type Rectangle struct {
	Width, Height float64
}

func (r Rectangle) Area() float64 {
	return r.Width * r.Height
}

func (r Rectangle) Perimeter() float64 {
	return 2 * (r.Width + r.Height)
}

En este ejemplo, Shape actúa como un contrato (similar a una clase abstracta o interfaz en otros lenguajes), y Circle y Rectangle son implementaciones concretas (análogos a clases normales). Podemos crear instancias de Circle y Rectangle, pero no podemos crear una instancia de Shape directamente. Además, ambas estructuras deben implementar los métodos Area() y Perimeter() para "cumplir" con la interfaz Shape.