Menu
Coddy logo textTech

Arayüz Kavramı

Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 40 / 61.

Şimdiye kadar struct'larımız veri ve davranışı birlikte içeriyordu: örneğin, bir adın yanında bir işlev işaretçisi. Peki ya bir struct yalnızca işlev işaretçileri içerseydi? Bu, güçlü bir şey oluşturur: bir arayüz.

Bir arayüz, işlemlerin nasıl çalıştığını belirtmeden hangi işlemlerin kullanılabilir olduğunu tanımlar. Bu, “bu arayüzü uygulayan herhangi bir nesne bu işlevleri sağlamalıdır” diyen bir sözleşmedir.

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

typedef struct {
    LogFunc log;
} ILogger;

ILogger yapısı yalnızca bir işlev işaretçisi içerir. Kendisine ait hiçbir verisi yoktur. Yalnızca davranışı tanımlar. "I" ön eki, bunun bir arabirim olduğunu belirten yaygın bir kuraldır.

ILogger kabul eden herhangi bir kod, günlük mesajının nereye gittiğiyle ilgilenmez. Mesaj konsola yazdırılabilir, bir dosyaya yazılabilir veya ağ üzerinden veri gönderilebilir. Çağıran yalnızca log çağrısı yapabileceğini bilir:

void process(ILogger* logger, const char* msg) {
    logger->log(msg);  // Nasıl logladığını bilmiyoruz
}

Bu ayrım, çok biçimliliğin özüdür. process işlevi, herhangi bir günlükleyici uygulamasıyla çalışır. İşlevin kodunu değiştirmeden davranışları değiştirebilirsiniz. Bir sonraki derste, bu arayüz sözleşmesini yerine getiren somut uygulamalar oluşturacaksınız.

challenge icon

Görev

Kolay

Bir ICalculator arayüzü oluşturalım: herhangi bir hesap makinesinin desteklemesi gereken işlemleri, bunların nasıl çalıştığını belirtmeden tanımlayan ve yalnızca işlev işaretçileri içeren bir yapı.

Kodunuzu düzenlemek için iki dosya oluşturacaksınız:

  • calculator.h: Arayüzünüzü burada tanımlayın. İki BinaryOp parametresi alan ve bir int döndüren, int adlı bir işlev işaretçisi türü oluşturun. Ardından yalnızca iki işlev işaretçisi içeren bir ICalculator yapısı tanımlayın: operate (BinaryOp türünde) ve parametre almayan, hiçbir şey döndürmeyen bir işlev işaretçisi olan describe. Bu yapı tamamen bir arayüzdür. Veri içermez, yalnızca davranış içerir.
  • main.c: Başlık dosyanızı dahil edin ve arayüzü karşılayabilecek somut işlevleri uygulayın:
    • add: iki tamsayının toplamını döndürür
    • multiply: iki tamsayının çarpımını döndürür
    • describe_add: Addition yazdırır
    • describe_multiply: Multiplication yazdırır
    Ardından bir ICalculator örneği oluşturun, girdiye göre bunu uygun işlevlerle bağlayın ve bir hesaplama gerçekleştirmek için kullanın.

Programınız üç girdi alacaktır: iki tamsayı ve bir işlem kodu (toplama için 1, çarpma için 2).

İşlem koduna göre ICalculator yapınızı uygun işlev çiftiyle bağlayın. Ardından işlem adını yazdırmak için arayüz üzerinden describe işlevini çağırın; sonrasında sonucu hesaplayıp yazdırmak için operate işlevini çağırın.

Girdilerin 5, 3 ve 1 olduğu durumdaki örnek çıktı:

Addition
8

Girdilerin 4, 7 ve 2 olduğu durumdaki örnek çıktı:

Multiplication
28

Temel çıkarım, ICalculator yapınızın bir sözleşme tanımlamasıdır: bunu kullanan herhangi bir kod, hangi belirli işlevlerin bağlandığını bilmeden describe ve operate işlevlerini çağırabileceğini bilir. Başlık dosyanızda include guard kullanmayı unutmayın.

Kendin dene

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

// TODO: add fonksiyonunu implement et
// İki tamsayının toplamını döndürür


// TODO: multiply fonksiyonunu implement et
// İki tamsayının çarpımını döndürür


// TODO: describe_add fonksiyonunu implement et
// "Addition" yazdırır


// TODO: describe_multiply fonksiyonunu implement et
// Prints "Multiplication"


int main() {
    int num1, num2, op_code;
    scanf("%d", &num1);
    scanf("%d", &num2);
    scanf("%d", &op_code);
    
    // TODO: Bir ICalculator örneği oluştur
    
    
    // TODO: op_code'a göre (1 add için, 2 multiply için),
    // hesap makinesini uygun fonksiyonlarla bağla
    
    
    // TODO: Arayüz üzerinden describe'ı çağır
    
    
    // TODO: Arayüz üzerinden operate'ı çağır ve sonucu yazdır
    
    
    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C derleyicisi