Menu
Coddy logo textTech

Promoción de métodos

Parte de la sección Programación Orientada a Objetos del Journey de GO de Coddy. Lección 36 de 107.

Al igual que la inclusión de estructuras promueve los campos a la estructura externa, Go también promueve los métodos de los tipos incluidos. Esto significa que puedes llamar directamente a los métodos definidos en la estructura incluida desde la estructura externa.

type Engine struct {
    Horsepower int
}

func (e Engine) Start() string {
    return "Engine started"
}

type Car struct {
    Model string
    Engine  // embebido
}

Como Car incorpora Engine, el método Start() se promueve automáticamente:

func main() {
    c := Car{
        Model:  "Sedan",
        Engine: Engine{Horsepower: 200},
    }
    
    fmt.Println(c.Start())         // Motor arrancado
    fmt.Println(c.Engine.Start())  // también funciona
}

Esta promoción tiene una consecuencia importante para las interfaces. Si el tipo incrustado satisface una interfaz, el tipo externo también la satisface automáticamente:

type Starter interface {
    Start() string
}

func Ignite(s Starter) {
    fmt.Println(s.Start())
}

func main() {
    c := Car{Model: "Sedan", Engine: Engine{Horsepower: 200}}
    Ignite(c)  // Car satisface Starter a través de Engine
}

El tipo Car nunca implementa explícitamente Starter, pero satisface la interfaz porque su Engine incorporado tiene el método requerido. Así es como Go logra la reutilización del comportamiento sin la herencia tradicional.

challenge icon

Desafío

Fácil

Construyamos un sistema de reproducción de música que demuestre cómo los métodos de los tipos incrustados se promueven al tipo externo y cómo esto permite satisfacer una interfaz mediante composición.

Organizarás tu código en dos archivos:

  • audio.go: Crea los componentes básicos de tu reproductor de música:
    • Una estructura AudioPlayer con un campo Brand (string) y un método Play() string que devuelve [Brand] playing audio
    • Una interfaz Playable que requiere un método Play() string
    • Una estructura Smartphone con un campo Model que incrusta AudioPlayer
    • Una estructura Tablet con un campo Model que incrusta AudioPlayer
  • main.go: Crea una función llamada StartPlayback que acepte cualquier Playable y devuelva el resultado de llamar a Play(). Lee la información de los dispositivos desde la entrada, crea un Smartphone y una Tablet, y demuestra que ambos satisfacen la interfaz Playable mediante su AudioPlayer incrustado, aunque ninguno de los dos tipos implemente explícitamente Play() por sí mismo.

Se proporcionarán las siguientes entradas:

  • Línea 1: nombre del modelo del Smartphone
  • Línea 2: marca de audio del Smartphone
  • Línea 3: nombre del modelo de la Tablet
  • Línea 4: marca de audio de la Tablet

Para cada dispositivo, imprime su modelo seguido del resultado de pasarlo a StartPlayback.

Por ejemplo, dadas iPhone 15, Apple Audio, iPad Pro y Beats, tu salida debería ser:

iPhone 15
Apple Audio playing audio
iPad Pro
Beats playing audio

Observa cómo tanto Smartphone como Tablet se pueden pasar a StartPlayback porque el método Play() de AudioPlayer se promueve automáticamente a cada tipo externo, satisfaciendo la interfaz Playable sin ningún código adicional.

Pruébalo tú mismo

package main

import (
	"bufio"
	"fmt"
	"os"
)

// TODO: Crea una función StartPlayback que acepte cualquier Playable
// y devuelve el resultado de llamar a Play()

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	
	// Lee el modelo del smartphone
	scanner.Scan()
	smartphoneModel := scanner.Text()
	
	// Lee la marca de audio del smartphone
	scanner.Scan()
	smartphoneBrand := scanner.Text()
	
	// Lee el modelo de la tablet
	scanner.Scan()
	tabletModel := scanner.Text()
	
	// Lee la marca de audio de la tablet
	scanner.Scan()
	tabletBrand := scanner.Text()
	
	// TODO: Crea un Smartphone con el AudioPlayer embebido
	
	// TODO: Crea una Tablet con el AudioPlayer embebido
	
	// TODO: Imprime el modelo del smartphone, luego llama a StartPlayback con el smartphone
	
	// TODO: Imprime el modelo de la tablet, luego llama a StartPlayback con la tablet
	
	_ = smartphoneModel
	_ = smartphoneBrand
	_ = tabletModel
	_ = tabletBrand
	fmt.Println("TODO: Complete the implementation")
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Go online