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.
Tantangan
MudahMari 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 bernamaSpeakFuncyang tidak menerima parameter dan tidak mengembalikan nilai. Lalu, definisikan structSpeakeryang berisiname(sebuahconst char*) dan pointer fungsispeakbertipeSpeakFunc.main.c: Sertakan header-mu dan implementasikan tiga fungsi berbicara yang berbeda:bark: mencetakWoof!meow: mencetakMeow!chirp: mencetakChirp!
Speaker, masing-masing dipasangkan dengan fungsi yang berbeda berdasarkan input, dan panggil methodspeakmilik 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;
}
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