Metotları Simüle Etme
Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 39 / 61.
Bir işlev işaretçisinin bir struct içine nasıl yerleştirileceğini gördün. Asıl güç, aynı struct türünün farklı örneklerine farklı işlevler atadığında ortaya çıkar. Değişen davranışlara sahip yöntemleri bu şekilde taklit ederiz.
Özelleştirilebilir mantığa sahip bir eylemi temsil eden bir struct düşünün:
typedef void (*ActionFunc)(void);
typedef struct {
const char* name;
ActionFunc execute;
} Action;Örnekleri oluştururken her birine farklı işlevler bağlarsın:
void say_hello(void) {
printf("Hello!\n");
}
void say_goodbye(void) {
printf("Goodbye!\n");
}
int main() {
Action greet = { "Greet", say_hello };
Action farewell = { "Farewell", say_goodbye };
greet.execute(); // Çıktı: Hello!
farewell.execute(); // Çıktı: Goodbye!
return 0;
}Hem greet hem de farewell aynı türdedir (Action), ancak her birinde execute çağrıldığında tamamen farklı sonuçlar elde edilir. Yapı yalnızca veri tutmaz. Her örnek için farklılık gösteren davranışlar da barındırır.
Bu kalıp, nesnelerin diğer dillerde nasıl çalıştığını yansıtır: Aynı arayüzü paylaşsalar da her nesnenin bir yönteme ait kendi uygulaması olabilir.
Görev
KolayFarklı işlevlerin bağlandığı aynı yapı türündeki örneklerin nasıl tamamen farklı davranışlar sergileyebildiğini gösteren bir Speaker sistemi oluşturalım.
Kodunuzu düzenlemek için iki dosya oluşturacaksınız:
speaker.h: Hiç parametre almayan ve hiçbir değer döndürmeyenSpeakFuncadlı bir işlev işaretçisi türü tanımlayın. Ardından, birname(const char*) veSpeakFunctüründe birspeakişlev işaretçisi içeren birSpeakeryapısı tanımlayın.main.c: Başlık dosyanızı ekleyin ve üç farklı konuşma işlevi uygulayın:bark:Woof!yazdırırmeow:Meow!yazdırırchirp:Chirp!yazdırır
Speakerörneği oluşturun ve polimorfik davranışı görmek için bunlarınspeakyöntemlerini çağırın.
Programınız iki girdi alacak: birinci konuşmacı türü (bark için 1, meow için 2, chirp için 3) ve ikinci konuşmacı türü (yine 1, 2 veya 3).
İki Speaker örneği oluşturun. İstediğiniz adları verebilirsiniz (örneğin "Dog", "Cat", "Bird" veya yalnızca "Speaker1", "Speaker2"). Her birini girdi koduna göre uygun işleve bağlayın, ardından her örnekte sırayla speak çağrısı yapın.
Birinci tür 1, ikinci tür 2 olduğunda örnek çıktı:
Woof!
Meow!Birinci tür 3, ikinci tür 3 olduğunda örnek çıktı:
Chirp!
Chirp!Buradaki temel fikir, her iki konuşmacının da aynı Speaker türünde olmasına rağmen, her birinin speak üyesine farklı bir işlev atandığı için farklı çıktılar üretmesidir. Başlık dosyanızda include guard kullanmayı unutmayın.
Kendin dene
#include <stdio.h>
#include "speaker.h"
// TODO: "Woof!" yazdıran bark fonksiyonunu uygula
// TODO: "Meow!" yazdıran meow fonksiyonunu uygula
// TODO: "Chirp!" yazdıran chirp fonksiyonunu uygula
int main() {
int type1, type2;
scanf("%d", &type1);
scanf("%d", &type2);
// TODO: İki Speaker örneği oluştur
// TODO: İlk konuşmacının speak fonksiyonunu type1 değerine göre bağla
// (1 = bark, 2 = meow, 3 = chirp)
// TODO: İkinci konuşmacının speak fonksiyonunu type2 değerine göre bağla
// (1 = bark, 2 = meow, 3 = chirp)
// TODO: Her konuşmacının speak fonksiyonunu sırayla çağı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ı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