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.
Görev
KolayBir 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. İkiBinaryOpparametresi alan ve birintdöndüren,intadlı bir işlev işaretçisi türü oluşturun. Ardından yalnızca iki işlev işaretçisi içeren birICalculatoryapısı tanımlayın:operate(BinaryOptüründe) ve parametre almayan, hiçbir şey döndürmeyen bir işlev işaretçisi olandescribe. 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ürmultiply: iki tamsayının çarpımını döndürürdescribe_add:Additionyazdırırdescribe_multiply:Multiplicationyazdırır
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
8Girdilerin 4, 7 ve 2 olduğu durumdaki örnek çıktı:
Multiplication
28Temel çı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;
}
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
1Modüler Programlama Temelleri
Başlık DosyalarıInclude Guard'larKaynak DosyalarıStatik FonksiyonlarÖzet: Modüler Hesap Makinesi4Kapsülleme
Opaque Pointer KavramıOpaque Struct TanımlamaGetter ve Setter MetotlarıSetter Metotlarında DoğrulamaÖzet: Gizli Kutu2Nesneler ve Metotlar
Nesne Olarak Struct'lar'Self' İşaretçisiConst Doğruluğuİşaretçi vs DeğerYardımcı MetotlarÖzet: Point Manager5Proje: Basit Banka Hesabı
Proje KurulumuHesabın Oluşturulması3Nesne Yaşam Döngüsü
Constructor DeseniDestructor DeseniStack İlklendirmeDerin KopyalamaÖzet: String Wrapper6Kompozisyon Yoluyla Kalıtım
Struct Gömmeİlk Üye KuralıÜst Üyelere ErişimUpcastingÖzet: Şekil HiyerarşisiKendi başına pratik yap: Online C derleyicisi