Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Hangi 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ürmeyen SpeakFunc adlı bir işlev işaretçisi türü tanımlayın. Ardından bir Speaker (name) ve const char* türünde bir speak işlev işaretçisi içeren bir SpeakFunc yapı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ır
    • meow: Meow! yazdırır
    • chirp: Chirp! yazdırır
    Ardından, girdiye göre her biri farklı bir işleve bağlanmış iki Speaker örneği oluşturun ve polimorfik davranışı iş başında görmek için bunların speak yö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;
}
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