Arayüzleri Uygulama
Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası. Ders 41 / 61.
Artık yalnızca function pointer’ları içeren bir struct olan interface’in ne olduğunu anladığınıza göre, bu sözleşmeyi yerine getiren somut uygulamalar oluşturmanın zamanı geldi.
Önceki dersteki ILogger arayüzümüzü hatırlayın:
typedef void (*LogFunc)(const char* message);
typedef struct {
LogFunc log;
} ILogger;Bu interface'i uygulamak için, LogFunc imzasıyla eşleşen gerçek functions yazar, ardından bu functions atanmış şekilde ILogger örnekleri create ederiz:
void console_log(const char* message) {
printf("[CONSOLE] %s\n", message);
}
void file_log(const char* message) {
printf("[FILE] %s\n", message); // Dosya çıktısını simüle etme
}
ILogger create_console_logger() {
ILogger logger = { console_log };
return logger;
}
ILogger create_file_logger() {
ILogger logger = { file_log };
return logger;
}Her bir "constructor" function, farklı bir function bağlanmış bir ILogger döndürür. Bu logger'ları kullanan kodun hangi uygulamayı aldığını bilmesine gerek yoktur:
void do_work(ILogger* logger) {
logger->log("Starting work...");
logger->log("Work complete!");
}
int main() {
ILogger console = create_console_logger();
ILogger file = create_file_logger();
do_work(&console); // console_log kullanır
do_work(&file); // file_log kullanır
return 0;
}do_work işlevi, günlük kaydı uygulamasından tamamen bağımsızdır. Temel mantığı değiştirmeden günlük kaydı araçlarını özgürce değiştirebilirsin: bir arayüze programlamanın gücü budur.
Görev
KolayHer iki uygulamanın da aynı arayüz sözleşmesini nasıl karşılayabileceğini gösteren bir INotifier sistemi oluşturalım. Ortak bir arayüze uyan ancak farklı çıktılar üreten somut bildirimciler, bir EmailNotifier ve bir SMSNotifier oluşturacaksın.
kodunu üç dosya arasında düzenleyeceksin:
notifier.h: Arayüzü burada Define et.const char*türünde bir message alan ve hiçbir şey döndürmeyenNotifyFuncadlı bir function pointer türü Create et. Ardından yalnızca bu türde birnotifyfunction pointer içeren birINotifierstruct tanımla. Ayrıca her biri değer olarak birINotifierdöndüren iki constructor function bildir:create_email_notifiervecreate_sms_notifier.notifier.c: Somut bildirim function'larını ve constructor'ları burada Implement et. Şunları Create et:email_notify: message'ı şu formatta yazdırır:[EMAIL] messagesms_notify: message'ı şu formatta yazdırır:[SMS] messagecreate_email_notifier:email_notify'a bağlanmış birINotifierdöndürürcreate_sms_notifier:sms_notify'a bağlanmış birINotifierdöndürür
main.c: Her şeyi burada bir araya getir. Bir notification type ve bir message oku, constructor function'larını kullanarak appropriate notifier'ı Create et ve notification'ı arayüz üzerinden gönder.
Programın iki girdisi olacak: bir notification type (email için 1, SMS için 2) ve gönderilecek bir message.
Appropriate notifier'ı Create etmek için constructor function'larını kullan, ardından message'ı görüntülemek üzere arayüz üzerinden notify'ı Call et.
type 1 ve message Meeting at 3pm olduğunda örnek çıktı:
[EMAIL] Meeting at 3pmtype 2 ve message Your code shipped olduğunda örnek çıktı:
[SMS] Your code shippedBu pattern'in gücü, main.c'in her notifier'ın dahili olarak nasıl çalıştığını bilmek zorunda olmamasıdır. Yalnızca arayüzün notify function'ını Call eder ve doğru Implementasyon çalışır. Header file'ında include guard'ları kullanmayı unutma.
Kendin dene
#include <stdio.h>
#include "notifier.h"
int main() {
int type;
char message[256];
// Bildirim türünü oku (1 e-posta için, 2 SMS için)
scanf("%d", &type);
getchar(); // yeni satırı tüket
// Mesajı oku
fgets(message, sizeof(message), stdin);
// Varsa sondaki yeni satırı kaldır
int len = 0;
while (message[len] != '\0') len++;
if (len > 0 && message[len-1] == '\n') message[len-1] = '\0';
// TODO: Türe göre uygun notifier'ı oluştur
// type 1 için create_email_notifier() kullan
// type 2 için create_sms_notifier() kullan
// TODO: Arayüz üzerinden notify fonksiyonunu çağır
// notifier.notify(message);
return 0;
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Object Oriented Programming 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ı8Polimorfizm
Struct'larda Fonksiyon İşaretçileriMetotları Simüle EtmeArayüz KavramıArayüzleri UygulamaPolimorfik İterasyonÖzet: Greeter3Nesne 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