Arayüzleri Uygulama
Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 41 / 61.
Artık yalnızca işaretçi içeren bir yapı olan arayüzün 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 arayüzü uygulamak için LogFunc imzasıyla eşleşen gerçek işlevler yazar, ardından bu işlevleri atayarak ILogger örnekleri oluştururuz:
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 "constructor" işlevi, içine farklı bir işlev bağlanmış bir ILogger döndürür. Bu günlükleyicileri 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
KolayFarklı uygulamaların aynı arayüz sözleşmesini nasıl yerine getirebileceğini gösteren bir INotifier sistemi oluşturalım. Ortak bir arayüze uyan ancak farklı çıktılar üreten somut bildirimciler, EmailNotifier ve SMSNotifier oluşturacaksın.
Kodunu üç dosyaya ayıracaksın:
notifier.h: Arayüzü burada tanımla.NotifyFunctüründe bir mesaj alan ve hiçbir şey döndürmeyenconst char*adlı bir işaretçi türü oluştur. Ardından yalnızca bu türde birINotifierişlev işaretçisi içeren birnotifyyapısı tanımla. Ayrıca her biri değer olarak bircreate_email_notifierdöndüren iki kurucu işlev bildir:create_sms_notifierveINotifier.notifier.c: Somut bildirim işlevlerini ve kurucuları burada uygula. Şunları oluştur:email_notify: Mesajı şu biçimde yazdırır:[EMAIL] messagesms_notify: Mesajı şu biçimde yazdırır:[SMS] messagecreate_email_notifier:INotifierişlevine bağlanmış biremail_notifydöndürürcreate_sms_notifier:INotifierişlevine bağlanmış birsms_notifydöndürür
main.c: Her şeyi burada bir araya getir. Bir bildirim türü ve mesaj oku, kurucu işlevleri kullanarak uygun bildirimciyi oluştur ve bildirimi arayüz üzerinden gönder.
Programın iki girdi alacak: bir bildirim türü (e-posta için 1, SMS için 2) ve gönderilecek bir mesaj.
Uygun bildirimciyi oluşturmak için kurucu işlevleri kullan, ardından mesajı görüntülemek için arayüz üzerinden notify işlevini çağır.
Türün 1 ve mesajın Meeting at 3pm olduğu durumdaki örnek çıktı:
[EMAIL] Meeting at 3pmTürün 2 ve mesajın Your code shipped olduğu durumdaki örnek çıktı:
[SMS] Your code shippedBu tasarım deseninin gücü, main.c dosyasının her bildirimcinin dahili olarak nasıl çalıştığını bilmek zorunda olmamasıdır. Yalnızca arayüzün notify işlevini çağırır ve doğru uygulama çalışır. Başlık dosyanda 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.
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ı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