Menu
Coddy logo textTech

El concepto de interfaz

Parte de la sección Programación Orientada a Objetos del Journey de C de Coddy. Lección 40 de 61.

Hasta ahora, nuestras estructuras han combinado datos y comportamiento: por ejemplo, un nombre junto a un puntero a función. Pero ¿qué pasaría si una estructura contuviera solo punteros a funciones? Esto crea algo poderoso: una interfaz.

Una interfaz define qué operaciones están disponibles sin especificar cómo funcionan. Es un contrato que indica: «cualquier objeto que implemente esta interfaz debe proporcionar estas funciones».

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

typedef struct {
    LogFunc log;
} ILogger;

La estructura ILogger no contiene más que un puntero a function. No tiene datos propios. Describe únicamente el comportamiento. El prefijo «I» es una convención común que indica que se trata de una interfaz.

Cualquier código que acepte un ILogger no se preocupa por adónde va el mensaje de registro. Podría imprimirlo en la consola, escribirlo en un archivo o enviar datos a través de una red. El código que realiza la llamada solo sabe que puede llamar a log:

void process(ILogger* logger, const char* msg) {
    logger->log(msg);  // No sabemos CÓMO registra
}

Esta separación es la esencia del polimorfismo. La función process funciona con cualquier implementación de registrador. Puedes intercambiar comportamientos sin cambiar el código de la función. En la siguiente lección, crearás implementaciones concretas que cumplen este contrato de interfaz.

challenge icon

Desafío

Fácil

Construyamos una interfaz ICalculator: una estructura que contiene únicamente punteros a funciones y define qué operaciones debe admitir cualquier calculadora sin especificar cómo funcionan.

Crearás dos archivos para organizar tu código:

  • calculator.h: Define aquí tu interfaz. Crea un tipo de puntero a función llamado BinaryOp que acepte dos parámetros int y devuelva un int. Después, define una estructura ICalculator que contenga únicamente dos punteros a funciones: operate (de tipo BinaryOp) y describe (un puntero a función que no acepte parámetros y no devuelva nada). Esta estructura es únicamente una interfaz. No contiene datos, solo comportamiento.
  • main.c: Incluye tu archivo de encabezado e implementa funciones concretas que puedan cumplir la interfaz:
    • add: devuelve la suma de dos enteros
    • multiply: devuelve el producto de dos enteros
    • describe_add: imprime Addition
    • describe_multiply: imprime Multiplication
    Después, crea una instancia de ICalculator, conéctala según la entrada y úsala para realizar un cálculo.

Tu programa recibirá tres entradas: dos enteros y un código de operación (1 para la suma, 2 para la multiplicación).

Según el código de operación, conecta tu ICalculator con el par de funciones apropiado. Después, llama a describe a través de la interfaz para imprimir el nombre de la operación, seguido de una llamada a operate para calcular e imprimir el resultado.

Salida de ejemplo cuando las entradas son 5, 3 y 1:

Addition
8

Salida de ejemplo cuando las entradas son 4, 7 y 2:

Multiplication
28

La idea clave es que tu estructura ICalculator define un contrato: cualquier código que la use sabe que puede llamar a describe y operate sin saber qué funciones específicas están conectadas. Recuerda usar protectores de inclusión en tu archivo de encabezado.

Pruébalo tú mismo

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

// TODO: Implementa la función add
// Devuelve la suma de dos enteros


// TODO: Implementa la función multiply
// Devuelve el producto de dos enteros


// TODO: Implementa la función describe_add
// Imprime "Addition"


// TODO: Implementa la función describe_multiply
// Prints "Multiplication"


int main() {
    int num1, num2, op_code;
    scanf("%d", &num1);
    scanf("%d", &num2);
    scanf("%d", &op_code);
    
    // TODO: Crea una instancia de ICalculator
    
    
    // TODO: Basado en op_code (1 para add, 2 para multiply),
    // conecta la calculadora con las funciones apropiadas
    
    
    // TODO: Llama a describe a través de la interfaz
    
    
    // TODO: Llama a operate a través de la interfaz e imprime el resultado
    
    
    return 0;
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de C online