Konsep Interface
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C di Coddy. Pelajaran 40 dari 61.
Sejauh ini, struct kita mencampur data dan perilaku: misalnya, nama bersama pointer fungsi. Namun, bagaimana jika sebuah struct hanya berisi pointer fungsi? Ini menciptakan sesuatu yang berguna: sebuah interface.
Sebuah interface mendefinisikan operasi apa yang tersedia tanpa menentukan bagaimana operasi tersebut bekerja. Interface adalah kontrak yang menyatakan "setiap object yang mengimplementasikan interface ini harus menyediakan fungsi-fungsi tersebut."
typedef void (*LogFunc)(const char* message);
typedef struct {
LogFunc log;
} ILogger;struct ILogger hanya berisi pointer fungsi. Struct ini tidak memiliki data sendiri. Struct ini hanya mendeskripsikan perilaku. Prefiks "I" adalah konvensi umum yang menunjukkan bahwa ini adalah interface.
Kode apa pun yang menerima ILogger tidak peduli ke mana pesan log dikirim. Pesan itu bisa dicetak ke konsol, ditulis ke file, atau dikirim melalui jaringan. Pemanggil hanya tahu bahwa ia bisa memanggil log:
void process(ILogger* logger, const char* msg) {
logger->log(msg); // Kita tidak tahu BAGAIMANA logger mencatat pesan
}Pemisahan ini adalah inti dari polimorfisme. Fungsi process bekerja dengan implementasi logger apa pun. Kamu dapat mengganti perilakunya tanpa mengubah kode fungsi tersebut. Di pelajaran berikutnya, kamu akan membuat implementasi konkret yang memenuhi kontrak antarmuka ini.
Tantangan
MudahMari buat interface ICalculator: sebuah struct yang hanya berisi pointer fungsi, yang menentukan operasi apa saja yang harus didukung oleh setiap kalkulator tanpa menentukan cara kerjanya.
Kamu akan membuat dua file untuk mengatur kodemu:
calculator.h: Definisikan interface-mu di sini. Buat tipe pointer fungsi bernamaBinaryOpyang menerima dua parameterintdan mengembalikanint. Lalu definisikan structICalculatoryang hanya berisi dua pointer fungsi:operate(bertipeBinaryOp) dandescribe(pointer fungsi yang tidak menerima parameter dan tidak mengembalikan apa pun). Struct ini murni sebuah interface. Struct ini tidak menyimpan data, hanya perilaku.main.c: Sertakan header-mu dan implementasikan fungsi konkret yang dapat memenuhi interface:add: mengembalikan jumlah dua bilangan bulatmultiply: mengembalikan hasil perkalian dua bilangan bulatdescribe_add: mencetakAdditiondescribe_multiply: mencetakMultiplication
ICalculator, hubungkan fungsi-fungsi yang sesuai berdasarkan input, dan gunakan instance tersebut untuk melakukan perhitungan.
Programmu akan menerima tiga input: dua bilangan bulat dan sebuah kode operasi (1 untuk penjumlahan, 2 untuk perkalian).
Berdasarkan kode operasi, hubungkan ICalculator-mu dengan pasangan fungsi yang sesuai. Lalu panggil describe melalui interface untuk mencetak nama operasi, kemudian panggil operate untuk menghitung dan mencetak hasilnya.
Contoh output saat inputnya adalah 5, 3, dan 1:
Addition
8Contoh output saat inputnya adalah 4, 7, dan 2:
Multiplication
28Inti utamanya adalah struct ICalculator-mu mendefinisikan sebuah kontrak: kode apa pun yang menggunakannya tahu bahwa kode tersebut dapat memanggil describe dan operate, tanpa mengetahui fungsi spesifik mana yang dihubungkan. Ingat untuk menggunakan include guard di file header-mu.
Coba sendiri
#include <stdio.h>
#include "calculator.h"
// TODO: Implementasikan fungsi add
// Mengembalikan jumlah dari dua bilangan bulat
// TODO: Implementasikan fungsi multiply
// Mengembalikan hasil kali dua bilangan bulat
// TODO: Implementasikan fungsi describe_add
// Mencetak "Addition"
// TODO: Implementasikan fungsi describe_multiply
// Mencetak "Multiplication"
int main() {
int num1, num2, op_code;
scanf("%d", &num1);
scanf("%d", &num2);
scanf("%d", &op_code);
// TODO: Buat instance ICalculator
// TODO: Berdasarkan op_code (1 untuk add, 2 untuk multiply),
// hubungkan kalkulator dengan fungsi yang sesuai
// TODO: Panggil describe melalui antarmuka
// TODO: Panggil operate melalui interface dan cetak hasilnya
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