Menu
Coddy logo textTech

Polimorfik Kullanım

Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 47 / 61.

challenge icon

Görev

Kolay

Temel Shape* işaretçisi aracılığıyla —ister bir Daire (Circle) ister bir Dikdörtgen (Rectangle) olsun— herhangi bir şekli işleyebilen bir fonksiyon yazarak polimorfizmin (çok biçimlilik) gerçekten işe yaradığını kanıtlayalım.

Mevcut Daire ve Dikdörtgen uygulamalarınızın üzerine inşa ederek, güçlü bir soyutlama ekleyeceksiniz: herhangi bir şekil türüyle tek tip çalışan tek bir fonksiyon.

Projeniz şu dosyaları içerecektir:

  • shape.h: DrawFunc ve AreaFunc türlerini içeren temel Shape arayüzünüz.
  • circle.h ve circle.c: Önceki dersteki Daire uygulamanız.
  • rectangle.h ve rectangle.c: Önceki dersteki Dikdörtgen uygulamanız.
  • shape.c: Bir Shape* işaretçisi alan process_shape adında yeni bir fonksiyon uygulayın. Bu fonksiyon, şeklin draw fonksiyonunu çağırmalı, ardından area fonksiyonunu çağırmalı ve sonucu Area: X.XX formatında 2 ondalık basamakla yazdırmalıdır.
  • main.c: Polimorfizmi iş başında gösterin. Bir şekil türü göstergesi (daire için c, dikdörtgen için r) ve ardından gerekli boyutları okuyun. Uygun şekli oluşturun, ardından gömülü Shape üyesine ait bir işaretçiyi process_shape fonksiyonuna geçirin. Aynı fonksiyon her iki türü de işler!

Programınız şunlardan birini alacaktır:

  • c ve ardından bir yarıçap değeri, veya
  • r ve ardından genişlik ve yükseklik değerleri

Girdiler c ve 5.0 olduğunda örnek çıktı:

Drawing Circle with radius: 5.00
Area: 78.54

Girdiler r, 4.0 ve 3.0 olduğunda örnek çıktı:

Drawing Rectangle with width: 4.00 and height: 3.00
Area: 12.00

Buradaki sihir, process_shape fonksiyonunun bir Daire ile mi yoksa Dikdörtgen ile mi çalıştığına dair hiçbir fikrinin olmamasıdır — o sadece Shape arayüzünü bilir. Somut şeklinizin gömülü Shape üyesini bir Shape* türüne dönüştürerek (casting), herhangi bir şekil türünü bu tek fonksiyona geçirebilirsiniz. Bu polimorfizmdir: tek bir fonksiyon, gerçek nesne türüne bağlı olarak birden fazla davranış.

main.c dosyasından çağrılabilmesi için process_shape fonksiyonunu shape.h içinde bildirmeyi unutmayın.

Kendin dene

#include <stdio.h>
#include "shape.h"
#include "circle.h"
#include "rectangle.h"

int main() {
    // TODO: Şekil türü için bir karakter oku (daire için 'c', dikdörtgen için 'r')
    // TODO: Eğer 'c' ise, yarıçapı oku, bir Circle oluştur ve tabanı ile process_shape fonksiyonunu çağır
    // TODO: Eğer 'r' ise, genişlik ve yüksekliği oku, bir Rectangle oluştur ve tabanı ile process_shape fonksiyonunu çağır
    return 0;
}

Object Oriented Programming bölümündeki tüm dersler