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 yapı içine nasıl yerleştirileceğini gördün. Asıl güç, aynı yapı 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;Örnekler oluştururken, her birine farklı işlevleri bağlarsınız:
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 biri üzerinde execute çağrıldığında tamamen farklı sonuçlar ortaya çıkar. Yapı yalnızca veri tutmaz. Örneğe göre değişen davranışı 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 ilişkin kendi uygulaması olabilir.
Görev
KolayHangi işlevin bunlara bağlandığına bağlı olarak aynı yapı türünün farklı örneklerinin tamamen farklı davranışlar sergileyebileceğini gösteren bir Speaker sistemi oluşturalım.
Kodunuzu düzenlemek için iki dosya oluşturacaksınız:
speaker.h: Parametre almayan ve hiçbir şey döndürmeyenSpeakFuncadlı bir işlev işaretçisi türü tanımlayın. Ardından birSpeaker(name) veconst char*türünde birspeakişlev işaretçisi içeren birSpeakFuncyapısı tanımlayın.main.c: Başlık dosyanızı dahil edin 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ışı iş başında görmek için bunlarınspeakyöntemlerini çağırın.
Programınız iki girdi alacak: ilk 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. Bunlara istediğiniz adları verebilirsiniz ("Dog", "Cat", "Bird" veya yalnızca "Speaker1", "Speaker2" gibi). Her birini, girdi koduna göre uygun işleve bağlayın ve ardından her örnekte speak işlevini sırayla çağırın.
İlk tür 1 ve ikinci tür 2 olduğundaki örnek çıktı:
Woof!
Meow!İlk tür 3 ve ikinci tür 3 olduğundaki örnek çıktı:
Chirp!
Chirp!Buradaki temel fikir, her iki konuşmacının da aynı Speaker türünde olması, ancak 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: type1'e göre ilk speaker'ın speak fonksiyonunu bağla
// (1 = bark, 2 = meow, 3 = chirp)
// TODO: type2'ye göre ikinci speaker'ın speak fonksiyonunu bağla
// (1 = bark, 2 = meow, 3 = chirp)
// TODO: Her speaker üzerinde sırayla speak'i ç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