C Nesne Tabanlı Programlama Örnekleri

C Nesne Tabanlı Programlama Örnekleri

C programlama dili, genellikle prosedürel bir dil olarak bilinse de, nesne tabanlı programlama (OOP) prensiplerini uygulamak mümkündür. C, nesne tabanlı programlamanın temel ilkelerini desteklemese de, belirli yapılar ve teknikler ile OOP’nin bazı özelliklerini taklit edebiliriz. Bu makalede, C dilinde nesne tabanlı programlama örnekleri ve bu yaklaşımların nasıl uygulanabileceği üzerinde duracağız.

Nesne Tabanlı Programlama Nedir?

Nesne tabanlı programlama, yazılım geliştirme sürecinde nesneleri kullanarak programların tasarlanmasını ve uygulanmasını sağlayan bir programlama paradigmasıdır. OOP, dört temel prensip etrafında şekillenir: kapsülleme, kalıtım, çok biçimlilik ve soyutlama. Bu prensipler, yazılımın daha modüler, esnek ve tekrar kullanılabilir olmasına yardımcı olur.

C’de OOP Prensipleri

C dilinde OOP’nin bazı temel prensiplerini uygulamak için aşağıdaki yöntemleri kullanabiliriz:

1. **Kapsülleme**: Verileri ve bu verilere erişim fonksiyonlarını bir arada tutmak için `struct` yapıları kullanabiliriz.

2. **Kalıtım**: C dilinde kalıtım, `struct` yapılarının iç içe geçirilmesi ile sağlanabilir.

3. **Çok Biçimlilik**: C dilinde çok biçimliliği sağlamak için işlev işaretçileri (function pointers) kullanılabilir.

4. **Soyutlama**: Soyutlama, karmaşık sistemlerin basit bir arayüzle temsil edilmesi anlamına gelir ve bu, fonksiyonlar ve `struct` yapıları ile gerçekleştirilebilir.

C’de Kapsülleme Örneği

Kapsülleme, verilerin ve bu verilere erişimi kontrol etmenin bir yoludur. Aşağıda, bir `Araba` yapısını ve bu yapıya ait fonksiyonları içeren bir örnek verilmiştir:

“`c

#include

#include

typedef struct {

char marka[20];

int yil;

float fiyat;

} Araba;

void arabaYaz(Araba *araba) {

printf(“Marka: %s, Yıl: %d, Fiyat: %.2f\n”, araba->marka, araba->yil, araba->fiyat);

}

void arabaSetMarka(Araba *araba, const char *marka) {

strncpy(araba->marka, marka, sizeof(araba->marka) – 1);

araba->marka[sizeof(araba->marka) – 1] = ‘\0’;

}

void arabaSetYil(Araba *araba, int yil) {

araba->yil = yil;

}

void arabaSetFiyat(Araba *araba, float fiyat) {

araba->fiyat = fiyat;

}

“`

Bu örnekte, `Araba` yapısı, arabanın marka, yıl ve fiyat bilgilerini saklar. `arabaYaz`, `arabaSetMarka`, `arabaSetYil` ve `arabaSetFiyat` fonksiyonları, bu verilere erişim ve güncelleme işlemlerini kapsüller.

C’de Kalıtım Örneği

C dilinde kalıtım, bir `struct` yapısının başka bir `struct` içinde kullanılması ile sağlanabilir. Aşağıda, `Araba` yapısından türetilen bir `ElektrikliAraba` yapısı örneği verilmiştir:

“`c

typedef struct {

Araba temelAraba; // Kalıtım

int bataryaKapasitesi; // Ek özellik

} ElektrikliAraba;

void elektrikliArabaYaz(ElektrikliAraba *elektrikliAraba) {

arabaYaz(&elektrikliAraba->temelAraba);

printf(“Batarya Kapasitesi: %d kWh\n”, elektrikliAraba->bataryaKapasitesi);

}

“`

Burada, `ElektrikliAraba` yapısı, `Araba` yapısından kalıtım alır ve ek bir özellik olan `bataryaKapasitesi`’ni içerir. Bu yapı, elektrikli araba bilgilerini yazdırmak için `elektrikliArabaYaz` fonksiyonunu kullanır.

C’de Çok Biçimlilik Örneği

Çok biçimlilik, aynı işlevin farklı türdeki nesneler üzerinde çalışabilmesini sağlar. C dilinde bunu işlev işaretçileri ile gerçekleştirebiliriz. Aşağıda, farklı araba türlerini temsil eden bir örnek verilmiştir:

“`c

typedef void (*YazdirFunc)(void *);

void arabaYazdir(void *araba) {

// Araba yazdırma işlemleri

}

void elektrikliArabaYazdir(void *elektrikliAraba) {

// Elektrikli araba yazdırma işlemleri

}

void yazdir(YazdirFunc func, void *nesne) {

func(nesne);

}

“`

Bu örnekte, `YazdirFunc` adında bir işlev işaretçisi tanımlanmıştır. `yazdir` fonksiyonu, farklı nesneleri yazdırmak için uygun işlevi çağırır.

C’de Soyutlama Örneği

Soyutlama, karmaşık sistemlerin basit bir arayüzle temsil edilmesini sağlar. Aşağıda, bir `Araba` arayüzü ve bu arayüzü uygulayan `ElektrikliAraba` yapısı örneği verilmiştir:

“`c

typedef struct {

void (*yaz)(void *);

} ArabaArayuzu;

void elektrikliArabaYaz(void *elektrikliAraba) {

// Elektrikli araba yazdırma işlemleri

}

ArabaArayuzu arabaOlustur() {

ArabaArayuzu arayuz;

arayuz.yaz = elektrikliArabaYaz;

return arayuz;

}

“`

Bu örnekte, `ArabaArayuzu` yapısı, bir yazdırma fonksiyonunu içerir. `arabaOlustur` fonksiyonu, `ElektrikliAraba` için uygun yazdırma fonksiyonunu atar.

C dilinde nesne tabanlı programlama, OOP’nin temel prensiplerini uygulamak için çeşitli teknikler ve yapılar kullanarak mümkündür. Kapsülleme, kalıtım, çok biçimlilik ve soyutlama gibi prensipler, C dilinde yazılım geliştirmeyi daha modüler ve esnek hale getirebilir. Bu makalede sunulan örnekler, C dilinde OOP’yi anlamak ve uygulamak için bir temel oluşturmayı amaçlamaktadır.

SSS (Sıkça Sorulan Sorular)

1. C dilinde nesne tabanlı programlama mümkün mü?

Evet, C dilinde nesne tabanlı programlama mümkün olmakla birlikte, C dilinin doğası gereği OOP’nin bazı özelliklerini taklit etmek için belirli teknikler ve yapılar kullanmak gerekmektedir.

2. Kapsülleme nedir?

Kapsülleme, verileri ve bu verilere erişim fonksiyonlarını bir arada tutarak, verilerin korunmasını ve kontrol edilmesini sağlar.

3. Kalıtım nasıl sağlanır?

C dilinde kalıtım, bir `struct` yapısının başka bir `struct` içinde kullanılması ile sağlanabilir.

4. Çok biçimlilik nedir?

Çok biçimlilik, aynı işlevin farklı türdeki nesneler üzerinde çalışabilmesini sağlayan bir OOP özelliğidir.

5. Soyutlama ne anlama gelir?

Soyutlama, karmaşık sistemlerin basit bir arayüzle temsil edilmesi anlamına gelir ve bu, fonksiyonlar ve `struct` yapıları ile gerçekleştirilebilir.

Başa dön tuşu