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.
Tantangan
MudahMari 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 bernamaTaskFuncyang tidak menerima parameter dan tidak mengembalikan apa pun. Lalu, definisikan structTaskyang berisiname(sebuahconst char*) dan pointer fungsirunbertipeTaskFunc.task.c: Implementasikan tiga fungsi tugas berbeda yang mewakili jenis pekerjaan yang berbeda:backup_task: mencetakBacking up data...cleanup_task: mencetakCleaning up files...report_task: mencetakGenerating report...
main.c: Satukan semuanya di sini. Buat array berisi structTask, 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 fungsirun.
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;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar Pemrograman Modular
file headerProteksi includefile sumberFungsi StatisRingkasan: Kalkulator Modular4Enkapsulasi
Konsep Opaque PointerMendefinisikan Opaque StructGetter dan SetterValidasi pada SetterUlasan: Kotak Rahasia2Object dan method
Struct sebagai objectPointer 'self'Konsistensi constPointer vs nilaiMethod pembantuRangkuman: Pengelola Point5Proyek: Akun Bank Sederhana
Penyiapan ProyekImplementasi Akun8Polimorfisme
Pointer Fungsi dalam StructMensimulasikan methodKonsep InterfaceMengimplementasikan InterfaceIterasi PolimorfikUlasan: Greeter3Siklus Hidup object
Pola KonstruktorPola DestruktorInisialisasi StackSalinan MendalamRangkuman: Pembungkus string6Pewarisan melalui Komposisi
Penyematan StructAturan Anggota PertamaMengakses Anggota ParentUpcastingRekap: Hierarki Bentuk9Proyek: Penggambar Bentuk
Ringkasan ProyekImplementasi LingkaranImplementasi Persegi PanjangPenggunaan PolimorfismeWadah BentukLatihan sendiri: Compiler C online