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 bervariasi.

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 setiap 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 keluaran yang sangat berbeda. Struct tidak hanya menyimpan data. Struct juga menyimpan perilaku yang bervariasi pada tiap instans.

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

challenge icon

Tantangan

Mudah

Mari buat sistem Speaker yang menunjukkan bagaimana instance berbeda dari tipe struct yang sama dapat memiliki perilaku yang benar-benar berbeda, bergantung pada fungsi yang dihubungkan ke masing-masing instance.

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 dihubungkan ke fungsi yang berbeda berdasarkan input, kemudian panggil method speak masing-masing untuk melihat perilaku polimorfik.

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 sesukamu (seperti "Dog", "Cat", "Bird", atau cukup "Speaker1", "Speaker2"). Hubungkan masing-masing instance ke fungsi yang sesuai berdasarkan kode inputnya, lalu panggil speak pada setiap instance secara berurutan.

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

Woof!
Meow!

Contoh output ketika 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 member 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 pada speaker pertama berdasarkan type1
    // (1 = bark, 2 = meow, 3 = chirp)
    
    // TODO: Hubungkan fungsi speak pada 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