Polimorfik Kullanım
Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 47 / 61.
Görev
KolayTemel 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:DrawFuncveAreaFunctürlerini içeren temelShapearayüzünüz.circle.hvecircle.c: Önceki dersteki Daire uygulamanız.rectangle.hverectangle.c: Önceki dersteki Dikdörtgen uygulamanız.shape.c: BirShape*işaretçisi alanprocess_shapeadında yeni bir fonksiyon uygulayın. Bu fonksiyon, şeklindrawfonksiyonunu çağırmalı, ardındanareafonksiyonunu çağırmalı ve sonucuArea: X.XXformatı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çinc, dikdörtgen içinr) ve ardından gerekli boyutları okuyun. Uygun şekli oluşturun, ardından gömülüShapeüyesine ait bir işaretçiyiprocess_shapefonksiyonuna geçirin. Aynı fonksiyon her iki türü de işler!
Programınız şunlardan birini alacaktır:
cve ardından bir yarıçap değeri, veyarve 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.54Girdiler r, 4.0 ve 3.0 olduğunda örnek çıktı:
Drawing Rectangle with width: 4.00 and height: 3.00
Area: 12.00Buradaki 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
1Modüler Programlama Temelleri
Başlık DosyalarıInclude Guard'larKaynak DosyalarıStatik FonksiyonlarÖzet: Modüler Hesap Makinesi4Kapsülleme
Opaque Pointer KavramıOpaque Struct TanımlamaGetter ve Setter MetotlarıSetter Metotlarında DoğrulamaÖzet: Gizli Kutu2Nesneler ve Metotlar
Nesne Olarak Struct'lar'Self' İşaretçisiConst Doğruluğuİşaretçi vs DeğerYardımcı MetotlarÖzet: Point Manager5Proje: Basit Banka Hesabı
Proje KurulumuHesabın Oluşturulması3Nesne Yaşam Döngüsü
Constructor DeseniDestructor DeseniStack İlklendirmeDerin KopyalamaÖzet: String Wrapper6Kompozisyon Yoluyla Kalıtım
Struct Gömmeİlk Üye KuralıÜst Üyelere ErişimUpcastingÖzet: Şekil Hiyerarşisi9Proje: Şekil Çizici
Projeye Genel BakışDaire Uygulaması