Polimorfik Kullanım
Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 47 / 61.
Görev
KolayPolimorfizmin 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:ShapeveDrawFunctürlerini içeren temelAreaFuncarayüzün.circle.hvecircle.c: Önceki dersteki Circle uygulaman.rectangle.hverectangle.c: Önceki dersteki Rectangle uygulaman.shape.c:process_shapeişaretçisi alanShape*adlı yeni bir işlev uygula. Bu işlev, şeklindrawişlevini, ardındanareaişlevini çağırmalı ve sonucuArea: X.XXbiçiminde 2 ondalık basamakla yazdırmalıdır.main.c: Polimorfizmi uygulamada göster. Bir şekil türü göstergesini (cdaire,rdikdörtgen için) ve ardından gerekli boyutları oku. Uygun şekli oluştur, sonra gömülüShapeüyesine bir işaretçiyiprocess_shapeiş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
cveya - 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.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 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
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ıDikdörtgen UygulamasıPolimorfik KullanımŞekil KapsayıcısıKendi başına pratik yap: Online C derleyicisi