Menu
CoddyTech

Mensimulasikan method

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

Kamu sudah melihat cara menempatkan pointer fungsi di dalam struct. Kekuatan sebenarnya muncul saat kamu menetapkan fungsi yang berbeda ke instance yang berbeda dari tipe struct yang sama. Dengan cara ini, kita menyimulasikan method dengan perilaku yang beragam.

Pertimbangkan sebuah struct yang merepresentasikan tindakan dengan logika yang dapat disesuaikan:

typedef void (*ActionFunc)(void);

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

Saat membuat instance, kamu menghubungkan fungsi yang berbeda ke masing-masing instance:

void say_hello(void) {
    printf("Hello!\n");
}

void say_goodbye(void) {
    printf("Goodbye!\n");
}

int main() {
    Action greet = { "Greet", say_hello };
    Action farewell = { "Farewell", say_goodbye };
    
    greet.execute();    // output: Hello!
    farewell.execute(); // output: Goodbye!
    return 0;
}

greet dan farewell memiliki tipe yang sama (Action), tetapi memanggil execute pada masing-masing menghasilkan hasil yang benar-benar berbeda. Struct tidak hanya menyimpan data. Struct juga menyimpan perilaku yang berbeda-beda untuk setiap instance.

Pola ini mencerminkan cara kerja object dalam bahasa lain: setiap object dapat memiliki implementasi method sendiri, meskipun semuanya menggunakan antarmuka yang sama.

challenge icon

Tantangan

Mudah

Mari buat sistem Speaker yang menunjukkan bagaimana beberapa instance dengan tipe struct yang sama dapat memiliki perilaku yang sepenuhnya berbeda, bergantung pada fungsi yang dipasangkan dengannya.

Kamu akan membuat dua file untuk mengatur kodemu:

  • speaker.h: Definisikan tipe pointer fungsi bernama SpeakFunc yang tidak menerima parameter dan tidak mengembalikan nilai. Lalu, definisikan struct Speaker yang berisi name (sebuah const char*) dan pointer fungsi speak bertipe SpeakFunc.
  • main.c: Sertakan header-mu dan implementasikan tiga fungsi berbicara yang berbeda:
    • bark: mencetak Woof!
    • meow: mencetak Meow!
    • chirp: mencetak Chirp!
    Lalu, buat dua instance Speaker, masing-masing dipasangkan dengan fungsi yang berbeda berdasarkan input, dan panggil method speak milik keduanya untuk melihat polimorfisme beraksi.

Programmu akan menerima dua input: tipe speaker pertama (1 untuk bark, 2 untuk meow, 3 untuk chirp) dan tipe speaker kedua (juga 1, 2, atau 3).

Buat dua instance Speaker. Kamu bisa menamainya sesuka hati (seperti "Dog", "Cat", "Bird", atau cukup "Speaker1", "Speaker2"). Pasangkan masing-masing dengan fungsi yang sesuai berdasarkan kode inputnya, lalu panggil speak pada setiap instance secara berurutan.

Contoh output saat tipe pertama adalah 1 dan tipe kedua adalah 2:

Woof!
Meow!

Contoh output saat tipe pertama adalah 3 dan tipe kedua adalah 3:

Chirp!
Chirp!

Hal penting yang perlu dipahami adalah kedua speaker memiliki tipe Speaker yang sama, tetapi menghasilkan output berbeda karena masing-masing memiliki fungsi berbeda yang ditetapkan ke anggota speak-nya. Ingat untuk menggunakan include guard di file header-mu.

Coba sendiri

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

// TODO: Implementasikan fungsi bark yang mencetak "Woof!"

// TODO: Implementasikan fungsi meow yang mencetak "Meow!"

// TODO: Implementasikan fungsi chirp yang mencetak "Chirp!"

int main() {
    int type1, type2;
    scanf("%d", &type1);
    scanf("%d", &type2);
    
    // TODO: Buat dua instance Speaker
    
    // TODO: Hubungkan fungsi speak milik speaker pertama berdasarkan type1
    // (1 = bark, 2 = meow, 3 = chirp)
    
    // TODO: Hubungkan fungsi speak milik speaker kedua berdasarkan type2
    // (1 = bark, 2 = meow, 3 = chirp)
    
    // TODO: Panggil speak pada setiap speaker secara berurutan
    
    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