Menu
Coddy logo textTech

Polimorfik Kullanım

Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 47 / 61.

challenge icon

Görev

Kolay

Polimorfizmin gerçekten çalıştığını, temel Shape* işaretçisi üzerinden ister Circle ister Rectangle olsun herhangi bir şekli işleyebilen bir işlev yazarak kanıtlayalım.

Mevcut Circle ve Rectangle uygulamalarını temel alarak güçlü bir soyutlama ekleyeceksin: her şekil türüyle aynı şekilde çalışan tek bir işlev.

Projen şu dosyaları içerecek:

  • shape.h: Shape ve DrawFunc türlerini içeren temel AreaFunc arayüzün.
  • circle.h ve circle.c: Önceki dersteki Circle uygulaman.
  • rectangle.h ve rectangle.c: Önceki dersteki Rectangle uygulaman.
  • shape.c: process_shape işaretçisi alan Shape* adlı yeni bir işlev uygula. Bu işlev, şeklin draw işlevini, ardından area işlevini çağırmalı ve sonucu Area: X.XX biçiminde 2 ondalık basamakla yazdırmalıdır.
  • main.c: Polimorfizmi uygulamada göster. Bir şekil türü göstergesini (c daire, r dikdörtgen için) ve ardından gerekli boyutları oku. Uygun şekli oluştur, sonra gömülü Shape üyesine bir işaretçiyi process_shape işlevine geçir. Aynı işlev her iki türü de işler!

Programın alacağı girdi şunlardan biri olacaktır:

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

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 işlevinin bir Circle veya Rectangle ile çalışıp çalışmadığını bilmemesidir. Bu işlev yalnızca Shape arayüzünü bilir. Somut şeklin gömülü Shape üyesini Shape* türüne dönüştürerek herhangi bir şekil türünü bu tek işleve geçirebilirsin. Polimorfizm budur: gerçek nesne türüne göre birden çok davranış sergileyen tek bir işlev.

process_shape dosyasından çağrılabilmesi için shape.h işlevini main.c içinde bildirmeyi unutma.

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 ('c' daire için, 'r' dikdörtgen için)
    // TODO: Eğer 'c' ise, yarıçapı oku, bir Circle oluştur ve process_shape'i tabanı ile çağır
    // TODO: Eğer 'r' ise, genişlik ve yüksekliği oku, bir Rectangle oluştur ve process_shape'i tabanı ile çağır
    return 0;
}

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C derleyicisi