Menu
CoddyTech

Iterasi Polimorfik

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C di Coddy. Pelajaran 42 dari 61.

Kamu telah belajar membuat antarmuka dan mengimplementasikannya dengan berbagai fungsi konkret. Manfaat sebenarnya terasa saat kamu dapat memperlakukan sekumpulan object yang berbeda secara seragam: menelusurinya dan memanggil pointer fungsi yang sama pada masing-masing object, terlepas dari perilaku spesifik yang terhubung dengannya.

Bayangkan kamu memiliki array berisi struct Action, masing-masing dengan fungsi execute yang ditetapkan:

typedef void (*ExecuteFunc)(void);

typedef struct {
    const char* name;
    ExecuteFunc execute;
} Action;

void jump(void) { printf("Jumping!\n"); }
void run(void)  { printf("Running!\n"); }
void rest(void) { printf("Resting...\n"); }

Kamu bisa membuat array berisi tindakan-tindakan ini, masing-masing dihubungkan ke fungsi yang berbeda, lalu menelusurinya dengan for loop sederhana:

int main() {
    Action actions[3] = {
        { "Jump", jump },
        { "Run", run },
        { "Rest", rest }
    };
    
    for (int i = 0; i < 3; i++) {
        printf("%s: ", actions[i].name);
        actions[i].execute();
    }
    return 0;
}

Perulangan tidak tahu atau peduli dengan apa yang dilakukan setiap tindakan di dalamnya. Perulangan hanya memanggil execute() pada setiap elemen.

Inilah polimorfisme dalam tindakan: kode yang sama menangani object dengan perilaku yang sama sekali berbeda. Untuk menambahkan tipe tindakan baru, kamu tidak perlu mengubah logika perulangannya. Kamu hanya perlu menambahkan elemen lain ke array.

challenge icon

Tantangan

Mudah

Mari kita buat sistem pengelolaan Task yang menunjukkan iterasi polimorfik: memproses kumpulan object yang memiliki antarmuka umum, tetapi menjalankan perilaku yang berbeda.

Kamu akan mengatur kodemu dalam tiga file:

  • task.h: Definisikan antarmuka tugas di sini. Buat tipe pointer fungsi bernama TaskFunc yang tidak menerima parameter dan tidak mengembalikan apa pun. Lalu, definisikan struct Task yang berisi name (sebuah const char*) dan pointer fungsi run bertipe TaskFunc.
  • task.c: Implementasikan tiga fungsi tugas berbeda yang mewakili jenis pekerjaan yang berbeda:
    • backup_task: mencetak Backing up data...
    • cleanup_task: mencetak Cleaning up files...
    • report_task: mencetak Generating report...
  • main.c: Satukan semuanya di sini. Buat array berisi struct Task, yang masing-masing terhubung ke fungsi tugas yang berbeda. Lalu, lakukan iterasi pada array dan jalankan setiap tugas secara polimorfik. Untuk setiap tugas, cetak namanya, lalu panggil fungsi run.

Programmu akan menerima satu input: jumlah tugas yang akan dijalankan (1, 2, atau 3).

Buat array yang berisi tepat tiga tugas dengan urutan berikut: tugas pencadangan bernama Backup, tugas pembersihan bernama Cleanup, dan tugas laporan bernama Report. Berdasarkan jumlah input, lakukan iterasi hanya pada sebanyak itu tugas, dimulai dari awal array.

Untuk setiap tugas dalam perulangan, cetak nama tugas diikuti titik dua dan spasi, lalu panggil fungsi run.

Contoh output saat inputnya 2:

Backup: Backing up data...
Cleanup: Cleaning up files...

Contoh output saat inputnya 3:

Backup: Backing up data...
Cleanup: Cleaning up files...
Report: Generating report...

Inti utamanya adalah perulanganmu tidak perlu mengetahui apa yang dilakukan setiap tugas. Perulangan hanya mencetak nama dan memanggil run() pada setiap elemen. Kode iterasi yang sama menangani semua jenis tugas secara seragam. Ingat untuk menggunakan penjaga include di file header.

Coba sendiri

#include <stdio.h>
#include "task.h"

// Deklarasikan fungsi task yang diimplementasikan di task.c
void backup_task(void);
void cleanup_task(void);
void report_task(void);

int main() {
    int count;
    scanf("%d", &count);
    
    // TODO: Buat array berisi 3 struct Task dengan urutan ini:
    // 1. Task pencadangan bernama "Backup" yang menggunakan backup_task
    // 2. Task pembersihan bernama "Cleanup" yang menggunakan cleanup_task
    // 3. Task pelaporan bernama "Report" yang menggunakan report_task
    
    // TODO: Lakukan perulangan pada 'count' task dari array
    // Untuk setiap task, cetak: "<name>: " lalu panggil fungsi run miliknya
    
    return 0;
}
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 C online