Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 bernama BinaryOp yang menerima dua parameter int dan mengembalikan int. Lalu definisikan struct ICalculator yang hanya berisi dua pointer fungsi: operate (bertipe BinaryOp) dan describe (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 bulat
    • multiply: mengembalikan hasil perkalian dua bilangan bulat
    • describe_add: mencetak Addition
    • describe_multiply: mencetak Multiplication
    Lalu buat sebuah instance 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
8

Contoh output saat inputnya adalah 4, 7, dan 2:

Multiplication
28

Inti 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;
}
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