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.
Tantangan
MudahMari 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 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 dihubungkan ke fungsi yang berbeda berdasarkan input, kemudian panggil methodspeakmasing-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;
}
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