Menu
CoddyTech

Koleksi Polimorfik

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

Salah satu penerapan antarmuka yang paling berguna adalah menyimpan berbagai tipe dalam koleksi yang sama. Slice bertipe antarmuka dapat menampung nilai apa pun yang memenuhi antarmuka tersebut, sehingga kamu dapat mengelompokkan tipe yang berbeda tetapi saling terkait.

Pertimbangkan skenario saat kamu perlu mengelola berbagai bentuk. Daripada menggunakan slice terpisah untuk setiap tipe, kamu bisa menggunakan satu slice dengan tipe interface:

type Shape interface {
    Area() float64
}

type Circle struct{ Radius float64 }
func (c Circle) Area() float64 { return 3.14159 * c.Radius * c.Radius }

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

func main() {
    shapes := []Shape{
        Circle{Radius: 5},
        Rectangle{Width: 4, Height: 3},
        Circle{Radius: 2},
    }
    
    for _, s := range shapes {
        fmt.Printf("Area: %.2f\n", s.Area())
    }
}

Slice shapes berisi lingkaran dan persegi panjang. Saat melakukan iterasi, setiap elemen merespons Area() sesuai dengan tipe sebenarnya. Ini adalah polimorfisme yang diterapkan pada koleksi: perulangan yang sama menangani semua tipe bentuk secara seragam.

Koleksi polimorfik penting saat membangun sistem yang memproses beragam item: sistem notifikasi yang mengirim email dan pesan SMS, game yang memperbarui berbagai jenis musuh, atau pemroses dokumen yang menangani beberapa format file. Koleksi tersebut tidak memedulikan tipe tertentu, yang penting setiap elemen menyediakan perilaku yang diperlukan.

challenge icon

Tantangan

Mudah

Mari kita bangun sistem pengelolaan tugas yang menangani berbagai jenis tugas melalui antarmuka terpadu. Kamu akan membuat beragam jenis tugas dan memproses semuanya bersama-sama dalam koleksi polimorfik.

Kamu akan mengatur kodemu dalam tiga file:

  • task.go: Definisikan antarmuka Task yang mengharuskan adanya method Summary() string. Antarmuka ini akan menjadi kontrak umum yang harus dipenuhi oleh semua jenis tugas.
  • types.go: Buat tiga jenis tugas berbeda yang masing-masing mengimplementasikan antarmuka Task:
    • BugFix dengan field ID (string) dan Severity (string). Summary()-nya mengembalikan Bug #[ID] ([Severity])
    • Feature dengan field Name (string) dan Points (int). Summary()-nya mengembalikan Feature: [Name] - [Points] pts
    • Documentation dengan field Topic (string). Summary()-nya mengembalikan Docs: [Topic]
  • main.go: Buat fungsi bernama PrintBacklog yang menerima slice Task dan mencetak ringkasan setiap tugas pada barisnya sendiri. Baca detail tugas dari input, buat satu tugas untuk setiap jenis, kumpulkan semuanya ke dalam satu slice []Task, lalu berikan slice tersebut ke PrintBacklog.

Input berikut akan diberikan:

  • Baris 1: ID bug
  • Baris 2: Tingkat keparahan bug
  • Baris 3: Nama fitur
  • Baris 4: Poin fitur (bilangan bulat)
  • Baris 5: Topik dokumentasi

Misalnya, jika diberikan 1042, critical, Themes, 8, dan API, output-mu seharusnya:

Bug #1042 (critical)
Feature: Themes - 8 pts
Docs: API

Keunggulannya adalah PrintBacklog tidak memerlukan logika terpisah untuk bug, fitur, atau dokumentasi. Fungsi ini cukup melakukan iterasi pada slice dan memanggil Summary() pada setiap elemen. Setiap jenis tugas memberikan respons dengan format uniknya sendiri, yang menunjukkan bagaimana koleksi polimorfik memungkinkanmu memproses beragam jenis secara seragam.

Coba sendiri

package main

import (
	"fmt"
)

// TODO: Buat fungsi PrintBacklog yang menerima slice berisi Task
// dan mencetak ringkasan setiap tugas pada baris tersendiri

func main() {
	// Baca input
	var bugID string
	var bugSeverity string
	var featureName string
	var featurePoints int
	var docTopic string

	fmt.Scanln(&bugID)
	fmt.Scanln(&bugSeverity)
	fmt.Scanln(&featureName)
	fmt.Scanln(&featurePoints)
	fmt.Scanln(&docTopic)

	// TODO: Buat satu tugas untuk setiap tipe (BugFix, Feature, Documentation)

	// TODO: Kumpulkan semua tugas ke dalam satu slice []Task

	// TODO: Panggil PrintBacklog dengan slice berisi tugas
}
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