Menu
Coddy logo textTech

Koncepcja interfejsu

Część sekcji Programowanie obiektowe ścieżki C w Coddy. Lekcja 40 z 61.

Do tej pory nasze struktury łączyły dane i zachowanie: na przykład nazwę obok wskaźnika do funkcji. Ale co, jeśli struktura zawierałaby wyłącznie wskaźniki do funkcji? Powstaje wtedy coś potężnego: interfejs.

Interfejs określa, jakie operacje są dostępne, nie precyzując, jak działają. To kontrakt, który mówi: „każdy obiekt implementujący ten interfejs musi udostępniać te funkcje”.

typedef void (*LogFunc)(const char* message);

typedef struct {
    LogFunc log;
} ILogger;

Struktura ILogger zawiera wyłącznie wskaźnik do funkcji. Nie ma własnych danych. Opisuje wyłącznie zachowanie. Prefiks „I” to powszechna konwencja wskazująca, że jest to interfejs.

Żaden kod, który przyjmuje ILogger, nie przejmuje się tym, dokąd trafia komunikat dziennika. Może go wypisywać w konsoli, zapisywać w pliku lub wysyłać dane przez sieć. Wywołujący wie tylko, że może wywołać log:

void process(ILogger* logger, const char* msg) {
    logger->log(msg);  // Nie wiemy, JAK zapisuje logi
}

To rozdzielenie jest istotą polimorfizmu. Funkcja process działa z dowolną implementacją rejestratora. Możesz zmieniać zachowanie bez zmieniania kodu funkcji. W następnej lekcji utworzysz konkretne implementacje spełniające ten kontrakt interfejsu.

challenge icon

Wyzwanie

Łatwy

Zbudujmy interfejs ICalculator: strukturę, która zawiera wyłącznie wskaźniki do funkcji, określającą, jakie operacje musi obsługiwać każdy kalkulator, bez precyzowania, jak mają działać.

Utworzysz dwa pliki, aby uporządkować swój kod:

  • calculator.h: Zdefiniuj tutaj swój interfejs. Utwórz typ wskaźnika do funkcji o nazwie BinaryOp, która przyjmuje dwa parametry int i zwraca int. Następnie zdefiniuj strukturę ICalculator, która zawiera tylko dwa wskaźniki do funkcji: operate (typu BinaryOp) oraz describe (wskaźnik do funkcji, która nie przyjmuje parametrów i niczego nie zwraca). Ta struktura jest wyłącznie interfejsem. Nie przechowuje żadnych danych, tylko zachowanie.
  • main.c: Dołącz plik nagłówkowy i zaimplementuj konkretne funkcje, które spełniają wymagania interfejsu:
    • add: zwraca sumę dwóch liczb całkowitych
    • multiply: zwraca iloczyn dwóch liczb całkowitych
    • describe_add: wyświetla Addition
    • describe_multiply: wyświetla Multiplication
    Następnie utwórz instancję ICalculator, przypisz jej odpowiednie funkcje na podstawie danych wejściowych i użyj jej do wykonania obliczenia.

Program otrzyma trzy dane wejściowe: dwie liczby całkowite i kod operacji (1 oznacza dodawanie, 2 mnożenie).

Na podstawie kodu operacji przypisz do ICalculator odpowiednią parę funkcji. Następnie wywołaj describe za pośrednictwem interfejsu, aby wyświetlić nazwę operacji, a potem wywołaj operate, aby obliczyć i wyświetlić wynik.

Przykładowy wynik, gdy dane wejściowe to 5, 3 i 1:

Addition
8

Przykładowy wynik, gdy dane wejściowe to 4, 7 i 2:

Multiplication
28

Najważniejsze jest to, że struktura ICalculator definiuje kontrakt: każdy kod, który z niej korzysta, wie, że może wywołać describe i operate, nie wiedząc, które konkretne funkcje zostały przypisane. Pamiętaj o użyciu strażników dołączania w pliku nagłówkowym.

Spróbuj swoich sił

#include <stdio.h>
#include "calculator.h"

// TODO: Zaimplementuj funkcję add
// Zwraca sumę dwóch liczb całkowitych


// TODO: Zaimplementuj funkcję multiply
// Zwraca iloczyn dwóch liczb całkowitych


// TODO: Zaimplementuj funkcję describe_add
// Wypisuje "Addition"


// TODO: Zaimplementuj funkcję describe_multiply
// Wypisuje "Multiplication"


int main() {
    int num1, num2, op_code;
    scanf("%d", &num1);
    scanf("%d", &num2);
    scanf("%d", &op_code);
    
    // TODO: Utwórz instancję ICalculator
    
    
    // TODO: Na podstawie op_code (1 dla add, 2 dla multiply)
    // przypisz odpowiednie funkcje do kalkulatora
    
    
    // TODO: Wywołaj describe przez interfejs
    
    
    // TODO: Wywołaj operate przez interfejs i wypisz wynik
    
    
    return 0;
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C online