Menu
CoddyTech

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.

challenge icon

Görev

Kolay

Farklı 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ürmeyen SpeakFunc adlı bir işlev işaretçisi türü tanımlayın. Ardından, bir name (const char*) ve SpeakFunc türünde bir speak işlev işaretçisi içeren bir Speaker yapısı tanımlayın.
  • main.c: Başlık dosyanızı ekleyin ve üç farklı konuşma işlevi uygulayın:
    • bark: Woof! yazdırır
    • meow: Meow! yazdırır
    • chirp: Chirp! yazdırır
    Ardından, her biri girdiye göre farklı bir işleve bağlanmış iki Speaker örneği oluşturun ve polimorfik davranışı görmek için bunların speak yö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;
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online C derleyicisi