Menu
CoddyTech

Komposisi Interface

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 31 dari 107.

Go memungkinkan kamu membangun interface yang lebih besar dengan menggabungkan interface yang lebih kecil. Alih-alih mendefinisikan satu interface besar dengan banyak method, kamu menyematkan interface yang sudah ada ke dalam definisi interface baru.

type Reader interface {
    Read() string
}

type Writer interface {
    Write(data string)
}

// ReadWriter menggabungkan kedua interface
type ReadWriter interface {
    Reader
    Writer
}

Interface ReadWriter kini mensyaratkan method Read() dan Write(). Tipe apa pun yang mengimplementasikan kedua method tersebut memenuhi ReadWriter, serta Reader dan Writer secara terpisah.

type File struct {
    Name string
}

func (f File) Read() string       { return "file content" }
func (f File) Write(data string)  { fmt.Println("Writing:", data) }

func Process(rw ReadWriter) {
    content := rw.Read()
    rw.Write(content)
}

func main() {
    f := File{Name: "data.txt"}
    Process(f)  // File memenuhi antarmuka ReadWriter
}

Pendekatan komposisi ini menjaga antarmuka tetap kecil dan terfokus. Kamu bisa menggabungkan antarmuka sesuai kebutuhan untuk membuat kontrak yang tepat bagi fungsi-fungsimu. Pustaka standar Go banyak menggunakan pola ini, seperti io.ReadWriter yang menggabungkan io.Reader dan io.Writer.

challenge icon

Tantangan

Mudah

Mari kita buat sistem pemutar media yang menunjukkan komposisi interface. Kamu akan membuat interface kecil dengan fokus tertentu, lalu menggabungkannya menjadi interface gabungan yang lebih andal dan dapat dipenuhi oleh satu tipe.

Kamu akan mengatur kodemu dalam dua file:

  • media.go: Definisikan tiga interface dan sebuah struct yang mengimplementasikan semuanya:
    • Interface Player dengan method Play() string
    • Interface Recorder dengan method Record(content string) string
    • Interface MediaDevice yang menggabungkan Player dan Recorder
    • Struct SmartDevice dengan field Name yang mengimplementasikan semua method yang diperlukan
  • main.go: Buat fungsi yang menunjukkan cara menggunakan SmartDevice yang sama melalui tipe interface yang berbeda. Tulis tiga fungsi:
    • UsePlayer yang menerima Player dan memanggil method Play-nya
    • UseRecorder yang menerima Recorder dan string konten, lalu memanggil Record
    • UseMediaDevice yang menerima MediaDevice dan string konten, lalu memanggil Record dan Play
    Baca nama perangkat dan konten dari input, buat SmartDevice, lalu tunjukkan cara menggunakannya melalui ketiga tipe interface.

Input berikut akan diberikan:

  • Baris 1: Nama perangkat
  • Baris 2: Konten yang akan direkam

Method-mu harus mengembalikan string dalam format berikut:

  • Play(): [Name] is playing
  • Record(content): [Name] recorded: [content]

Misalnya, jika diberikan MyPhone dan voice memo, output-mu seharusnya:

MyPhone is playing
MyPhone recorded: voice memo
MyPhone recorded: voice memo
MyPhone is playing

Dua baris pertama menunjukkan perangkat yang digunakan melalui interface masing-masing (Player dan Recorder). Dua baris terakhir menunjukkan perangkat yang digunakan melalui interface gabungan MediaDevice, yang memerlukan kedua kemampuan tersebut. Perhatikan bahwa satu SmartDevice milikmu memenuhi ketiga interface karena memiliki kedua method yang diperlukan.

Coba sendiri

package main

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

// TODO: Implementasikan UsePlayer yang menerima Player dan memanggil method Play-nya
// Fungsi ini harus mencetak hasil Play()

// TODO: Implementasikan UseRecorder yang menerima Recorder dan string content
// Fungsi ini harus mencetak hasil Record(content)

// TODO: Implementasikan UseMediaDevice yang menerima MediaDevice dan string content
// Fungsi ini harus mencetak hasil Record(content), lalu Play()

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	deviceName := scanner.Text()
	
	scanner.Scan()
	content := scanner.Text()
	
	// TODO: Buat SmartDevice dengan nama yang diberikan
	
	// TODO: Gunakan perangkat melalui interface Player
	
	// TODO: Gunakan perangkat melalui interface Recorder
	
	// TODO: Gunakan perangkat melalui interface MediaDevice
	
	_ = deviceName
	_ = content
	fmt.Println("Implement the solution")
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Go online