Bilgisayar programlamada dinamik iletim, altyordam çağrılarının ilişkin altyordam başlangıç adresine . Bir diğer deyişle, dinamik iletim program metnindeki bir çağrı ile işletilen altyordamın programın çalışması sırasında birbirine bağlanması durumudur. ve çokbiçimliliğin realize edilmesinde kullanılan bu bağlama yöntemi, yordamsal programlama dillerinde altyordam göstericileriyle gerçekleştirilirken, nesne yönelimli dillerde ve gerçekleştirme ilişkilerinin kullanılmasıyla otomatikman sağlanır. Altyordamların birinci sınıf dil öğesi olarak ele alındığı fonksiyonel programlama dillerinde ise, aynı işlevsellik altyordamların argüman olarak geçirilmesi ile sağlanabilir.
Dinamik İletim ve Diğer Kavramlar
Dinamik iletimin başlıca amacı, kullanıcının gereksinimlerine göre değişkenlik gösterebilecek kod parçalarının kullanıcı tarafından tamamlanmasını mümkün kılarak yazılım çerçevelerinin çokbiçimli kullanılabilmesini sağlamak ve böylece daha yüksek yeniden kullanım elde etmektir. Örnek olarak, görsel arayüzlü bir yazılımı kullanırken yaptıklarınızı düşünün, düğmelere basıyorsunuz, metin kutularını dolduruyorsunuz, listelerden seçimler yapıyorsunuz, vs. Ancak, düğmenin (ve diğer görsel öğelerin) davranışı temelde değişmediği halde, düğmeye basıldığında programın amacına dönük şeyler oluyor. Mesela, öğrenci kayıt formunun doldurulması sonrasında tıklanan Tamam düğmesi öğrenci kaydını yaparken, kitap alışverişi sitesindeki aynı görünüşlü düğmeyi tıklamanız kitapların evinize kadar gelmesini sağlayan bir sürecin başlamasına neden oluyor. Tıklamak eylemi aynıyken, olup biten değişiyor ve bunun görsel arayüz kitaplığını üreten firma tarafından bilinmesi olanaksız; resmin sizin kullandığınız yazılımı—öğrenci kayıt ve kitap alışveriş yazılımları—üretenler tarafından doldurulması gerekli. İşte bu, yordamsal programlama dillerinde altyordam göstericilerine uygun altyordamların adreslerini geçirerek sağlanırken, nesne yönelimli dillerde yazılım çerçevesince sağlanan üstsınıflardan kalıtlama veya arayüzleri gerçekleştirme ile sağlanabilir.
Üstsınıftan kalıtlama veya arayüz gerçekleştirme senaryosunun geçerli olduğu durumlarda, bir nesneye gönderilen ileti sonucunda hangi metodun çağrılacağını belirleyen aşağıdaki adımların akılda tutulması yararlı olacaktır.
- İletinin uygunluğu tutacak—gösterici veya referans da olabilir—türünün (statik tür) desteklediği iletilerle denetlenir. Derleme sırasında yapılan bu denetim, ileti ve metot imzalarının uyuşup uyuşmadığına bakar. Uyuşmanın olmaması durumunda, derleme hata mesajı vererek başarısız bir biçimde sona erecek ve bir sonraki adıma geçilmeyecektir.
- Tutacağın temsil ettiği nesnenin sınıfına (dinamik tür) bakarak hangi metodun çağrılacağına karar verilir. Bu karar, nesnenin sınıfında gerçekleştirilen veya üstsınıflardan kalıtlanan metotlardan biri seçilerek programın çalışması sırasında verilir.
Programlama Dilleri ve Dinamik İletim
C
Kabarcık sıralaması algoritmasının C programlama dilindeki gerçekleştirimini içeren aşağıdaki kabarcik_siralama
fonksiyonunun imzasında iki nokta dikkat çekiyor: fonksiyon göstericisi ve eleman türü olarak void*
ile eşanlamlı ilan edilmiş olan Object
. Bunlardan ilki dizinin eleman türüne ve/veya sıralama fonksiyonunun kullanılış bağlamına göre farklı biçimlerde sıralanmasını olanaklı kılarken, ikincisi dizinin herhangi bir türden eleman tutabilmesini—yani, dizinin soysal olmasını—sağlıyor.
- Kabarcik.h
#ifndef KABARCIK_H #define KABARCIK_H typedef void* Object; typedef int (*KARSILASTIRMA_FONK)(Object, Object); extern void kabarcik_siralama(Object dizi[], int boy, KARSILASTIRMA_FONK kar_fonk); #endif
Yukarıda sağlanan imzaya uygun gerçekleştirime göz atıldığında ise, işin püf noktasının fonksiyon göstericisinin kullanıldığı içteki döngünün ilk satırında olduğu görülür. Her ne kadar kar
adındaki bir fonksiyonun çağrılması ile aynı görünse de, aslında bu satırda kar
adlı fonksiyon göstericisinin sahip olduğu değerin işaret ettiği bellek konumunda başlayan bir fonksiyon çağrılmaktadır; kabarcik_siralama
fonksiyonunun çağrıldığı noktalarda kar
parametresine değişik değerlere sahip göstericilerin geçirilmesi, farklı karşılaştırma ölçütlerinin kullanılması ve dolayısıyla sıralamanın farklı türler ve/veya biçimlerde yapılması anlamına gelecektir.
- Kabarcik.c
#include <stdio.h> #include "Kabarcik.h" #define BOOL char #define FALSE 0 #define TRUE 1 static void takas_et(Object dz[], int sol_indis, int sag_indis) { Object gecici = dz[sol_indis]; dz[sol_indis] = dz[sag_indis]; dz[sag_indis] = gecici; } /* void takas_et(Object[], int, int) sonu */ void kabarcik_siralama(Object dz[], int boy, KARSILASTIRMA_FONK kar) { int gecis, j; for(gecis = 1; gecis < boy; gecis++) { BOOL takas_var = FALSE; for (j = 0; j < boy - gecis; j++) if (kar(dz[j], dz[j + 1]) > 0) { takas_et(dz, j, j + 1); takas_var = TRUE; } /* if sonu */ if (!takas_var) return; } /* for(gecis = 1; gecis < boy; gecis++) sonu */ } /* void kabarcik_siralama(Object[], int, KARSILASTIRMA_FONK) sonu */
Aşağıda sağlanan sınama programının incelenmesi olup bitenin daha iyi anlaşılmasını sağlayacaktır. kabarcik_siralama
fonksiyonunun ilk kullanılışı Integer
türlü elemanları olan bir diziyi karşılaştırma amacıyla int_kars
fonksiyonundan yararlanarak sıralarken, ikinci kullanılış komut satırında geçirilen karakter katarı dizisini karşılaştırmak için karakter_katarı_kars
fonksiyonundan yararlanarak sıralıyor.
- Kabarcik_Sinama.c
#include <stdio.h> #include <string.h> #include "Kabarcik.h" typedef int* Integer; void ksa_bas(char *ksa[], int boy) { ... } void intleri_bas(Integer dz[], int boy) { ... } int karakter_katar_kars(Object sol, Object sag) { return(strcmp((char*) sol, (char *) sag)); } /* int karakter_katar_kars(Object, Object) sonu */ int int_kars(Object sol, Object sag) { Integer ig1 = (Integer) sol; Integer ig2 = (Integer) sag; if (*ig1 > *ig2) return 1; else if (*ig1 < *ig2) return -1; else return 0; } /* int int_kars(Object, Object) sonu */ int main(int args, char *ksa[]) { int dizi[] = {1, 3, 102, 6, 34, 12, 35}, i; Integer int_dz[7]; for (i = 0; i < 7; i++) int_dz[i] = &dizi[i]; printf("\nTAMSAYI DIZISI SINANIYOR\n\nSiralama oncesi\n"); intleri_bas(int_dz, 7); kabarcik_siralama((Object*) int_dz, 7, &int_kars); printf("\nSiralama sonrasi\n"); intleri_bas(int_dz, 7); printf("\nKARAKTER KATARI DIZISI SINANIYOR\n\nSiralama oncesi\n"); ksa_bas(&ksa[1], args - 1); kabarcik_siralama((Object*) &ksa[1], args - 1, karakter_katari_kars); printf("Siralama sonrasi\n"); ksa_bas(&ksa[1], args - 1); return(0); } /* int main(int, char **) sonu */
C++
C'nin nesne yönelimli ardılı olan 'da dinamik iletim, fonksiyon göstericilerine ek olarak, üstsınıfta virtual
ilan edilen bir fonksiyonun altsınıflarda ihtiyaca uygun bir biçimde gerçekleştirilmesi veya ezilmesi ile sağlanır. Varsayılan iletim biçiminin statik olması nedeniyle, söz konusu fonksiyonun virtual
ilan edilmemesi dinamik iletimi ve dolayısıyla çokbiçimliliği engelleyecektir. Unutulmaması gereken bir diğer nokta, çokbiçimliliğin üstsınıf türünden bir gösterici veya referans—bir başka deyişle, derleyici tarafından özel bir biçimde ele alınan sabit gösterici—ile mümkün olduğudur. Bu, üstsınıf ve altsınıf nesnelerinin muhtemelen değişik büyüklüklerde olması, büyüklüğü çalışma anında belirlenebilen bellek bölgelerinin yığın bellekten ayrılması gerekliliği ve yığın belleğin ancak göstericiler ile işlenebilmesi nedeniyle zorunludur.
- Memur.hxx
#ifndef MEMUR_HXX #define MEMUR_HXX class Memur { ... public: virtual double aylik_gelir() = 0; ... }; // Memur sinifinin sonu #endif
İkinci aşamada yapılması gereken, dinamik iletimli çağrılacağı için virtual
ilan edilmiş olan fonksiyonların altsınıflarda tanımlanmakta olan türlerin özelliklerini göz önünde bulundurarak gerçekleştirmektir.
- GenelMudur.hxx
#ifndef GENELMUDUR_HXX #define GENELMUDUR_HXX #include "Memur.hxx" class GenelMudur : public Memur { ... }; #endif
- GenelMudur.c
#include "GenelMudur.hxx" ... double GenelMudur::aylik_gelir() { // Geliri derece, kademe ve alınabilecek rüşveti hesaba katarak hesapla. } // double GenelMudur::aylik_gelir() sonu ...
- DuzMemur.hxx
#ifndef DUZMEMUR_HXX #define DUZMEMUR_HXX #include "Memur.hxx" class DuzMemur : public Memur { ... }; #endif
- DuzMemur.c
#include "DuzMemur.hxx" ... double DuzMemur::aylik_gelir() { // Geliri derece ve kademeden yararlanarak hesapla. } // double DuzMemur::aylik_gelir() sonu ...
Dinamik iletimli fonksiyonun çokbiçimli kullanımına bir örnek aşağıdaki kod parçasından görülebilir. Dikkat edilecek olursa, memurlar
adındaki kabın eleman türü üstsınıfın referans türüne sahip tanımlanmış. Dolayısıyla, söz konusu kap Memur
veya Memur
gibi olan—yani, Memur
'dan kalıtlayan—herhangi bir türden nesneyi gösteren referanslar tutacaktır.
- Bordro.cpp
#include <vector> using namespace std; #include "Memur.hxx" #include "GenelMudur.hxx" #include "DuzMemur.hxx" int main(void) { vector<Memur&> memurlar; ... double toplam_odeme = 0; vector<Memur&>::const_iterator bas = memurlar.begin(), son = memurlar.end(); while(bas != son) { toplam_odeme += (*bas).aylik_gelir(); bas++; } // while (bas != son) sonu ... } // int main(void) sonu
Java
Java'da, final
ilan edilerek aksi söylenmedikçe, tüm metotlar dinamik iletimle çağrılır. Dolayısıyla, programcının fazladan bir şey yapmasına gerek yoktur.
Kalıtlama Yoluyla Çokbiçimlilik ve Dinamik İletim
- Memur.java
public abstract class Memur { ... public double gelir(); ... } // Memur sınıfının sonu
- GenelMüdür.java
public class GenelMüdür extends Memur { ... public double gelir() { // Geliri derece, kademe ve alınabilecek rüşveti hesaba katarak hesapla. } ... } // GenelMüdür sınıfının sonu
- DüzMemur.java
public class DüzMemur extends Memur { ... public double gelir() { // Geliri derece ve kademeden yararlanarak hesapla. } ... } // DüzMemur sınıfının sonu
Kalıtlama yoluyla çokbiçimliliğin örneklendiği aşağıdaki kod parçasından da görülebileceği gibi, gönderilen ileti sonucunda çağrılan metot, tutacağın arkasındaki nesnenin türüne göre belirlenmektedir. Buna göre, for
döngüsünün içindeki gelir
iletisi, kimi zaman GenelMüdür
kimi zamansa DüzMemur
sınıfındaki aynı imzalı metodun çağrılmasına neden olacaktır.
- Bordro.java
import java.util.Vector; public class Bordro { Vector<Memur> çalışanlar = new Vector<Memur>(); ... double toplamÖdeme = 0; for (Memur çalışan : çalışanlar) toplamÖdeme += çalışan.gelir(); ... } // Bordro sınıfının sonu
Gerçekleştirme Yoluyla Çokbiçimlilik ve Dinamik İletim
Java, türleri (sınıflar ve arayüzler) gibi olmak ilişkisine göre bir sıradüzenine koyan kalıtlama ilişkisinin yanı sıra sınıfları sahip oldukları ortak arayüzlere göre kategorize eden gerçekleştirme ilişkisini de sunar. Gerçekleştirme ilişkisi yoluyla dinamik iletimin kullanılması ve metotların çokbiçimli bir şekilde kullanılması, birbirleriyle benzer olsun veya olmasın, aynı kategoriye giren sınıfların ortak bir arayüzü gerçekleştirmesi ile mümkün olur.
- Öğrenci.java
package öğrenciişleri; public class Öğrenci implements Comparable<Öğrenci>{ ... pubic int compareTo(Öğrenci sağ) { ... } ... } // Öğrenci sınıfının sonu
- Vatandaş.java
package gelirvergisi; public class Vatandaş implements Comparable<Vatandaş>{ ... public int compareTo(Vatandaş sağ) { ... } ... } // Vatandaş sınıfının sonu
- Algoritmalar.java
package algoritmalar; import java.util.*; public class Sıralamalar { ... public static <V extends Comparable<? extends V>> void kabarcık(List<V> kap) { if (kap.length <= 1) return; boolean takasVar = false; int geçiş = 1; do { takasVar = false; for (int j = 0; j < kap.length - geçiş; j++) { V oAnki = kap.get(j), sonraki = kap.get(j + 1); if (oAnki.compareTo(sonraki) > 0) { V geçici = oAnki; oAnki = sonraki; sonraki = geçici; takasVar = true; } // if (oAnki.compareTo(sonraki) > 0) sonu } // for (int j = 0; j < kap.length - geçiş; j++) sonu } while(++geçiş < kap.length && takasVar); } // <V extends Comparable<V>> void kabarcık(List<V>) sonu ... } // Sıralamalar sınıfının sonu
- AlgoritmaSınama.java
import gelirvergisi; import öğrenciişleri; import static algoritmalar.Sıralamalar; public class AlgoritmaSınama { ... kabarcık(öğrenciler); ... kabarcık(vergiMükellefleri); ... } // AlgoritmaSınama sınıfının sonu
Scheme
Fonksiyonel programlama dillerinden olan Scheme'de dinamik iletim, altyordamların birinci sınıf muamele görmesi nedeniyle oldukça kolay sağlanır. Altyordam türlerinin varlığı, altyordamların argüman olarak geçirilmesini ve altyordamlardan sonuç olarak döndürülmesini olanaklı kılar. Bunun sonucunda, çokbiçimli davranması beklenen altyordama değişik altyordamların geçirilmesi işimizi görecektir. Örneğin, aşağıdaki kabarcık sıralaması gerçekleştirimine ikinci argüman olarak >
geçirilmesi ilk argümandaki sayı dizisinin artan sırada sıralanması sağlarken, string-<
geçirilmesi ilk argümandaki karakter katarı dizisinin azalan sırada sıralanmasını sağlayacaktır.
(define (kabarcık-alg dz öncemi?) (define (eleman-takas dz i j) (let ([geçici (vector-ref dz i)]) (vector-set! dz i (vector-ref dz j)) (vector-set! dz j geçici))) (define (geçiş ub) (do ((i 0 (+ i 1)) (takas? #f)) ((= i (- ub 1)) takas?) (when (öncemi? (vector-ref dz (+ i 1)) (vector-ref dz i)) (eleman-takas dz i (+ i 1)) (set! takas? #t)))) (do ((j (vector-length dz) (- j 1)) (takas? #t (geçiş j))) ((or (not takas?) (= j 1)) dz)))
Notlar
- ^ Adres işlecinin (
&
) kullanımlardan birinde olup diğerinde olmaması sizi şaşırtmasın. Her iki durumda da geçirilen değer, söz konusu fonksiyonun başlangıç adresini işaret eden bir gösterici değeri olacaktır. - ^ Gerçekleştirimi sağlanmayan dinamik iletimli bir fonksiyonunun bulunması,
Memur
sınıfını bir soyut sınıf (İngilizce: abstract class) yapıyor. Dolayısıyla, kabımız içindeki referanslarınMemur
nesnelerini göstermesi, soyut bir sınıfın nesneleri yaratılamayacağı için, söz konusu olmayacaktır.
Ayrıca bakınız
Dış bağlantılar
- Geri çağrı (İngilizce) 6 Mayıs 2011 tarihinde Wayback Machine sitesinde arşivlendi.
- Havaleciler: .NET'te tür güvenlikli geri çağrılar (İngilizce) 11 Aralık 2011 tarihinde Wayback Machine sitesinde arşivlendi.
- Dinamik iletim (İngilizce) 31 Mart 2011 tarihinde Wayback Machine sitesinde arşivlendi.
- Dinamik iletimli fonksiyonlar (İngilizce)2 Ekim 2011 tarihinde Wayback Machine sitesinde arşivlendi.
wikipedia, wiki, viki, vikipedia, oku, kitap, kütüphane, kütübhane, ara, ara bul, bul, herşey, ne arasanız burada,hikayeler, makale, kitaplar, öğren, wiki, bilgi, tarih, yukle, izle, telefon için, turk, türk, türkçe, turkce, nasıl yapılır, ne demek, nasıl, yapmak, yapılır, indir, ücretsiz, ücretsiz indir, bedava, bedava indir, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, resim, müzik, şarkı, film, film, oyun, oyunlar, mobil, cep telefonu, telefon, android, ios, apple, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, pc, web, computer, bilgisayar
Bilgisayar programlamada dinamik iletim altyordam cagrilarinin iliskin altyordam baslangic adresine Bir diger deyisle dinamik iletim program metnindeki bir cagri ile isletilen altyordamin programin calismasi sirasinda birbirine baglanmasi durumudur ve cokbicimliligin realize edilmesinde kullanilan bu baglama yontemi yordamsal programlama dillerinde altyordam gostericileriyle gerceklestirilirken nesne yonelimli dillerde ve gerceklestirme iliskilerinin kullanilmasiyla otomatikman saglanir Altyordamlarin birinci sinif dil ogesi olarak ele alindigi fonksiyonel programlama dillerinde ise ayni islevsellik altyordamlarin arguman olarak gecirilmesi ile saglanabilir Dinamik Iletim ve Diger KavramlarDinamik iletimin baslica amaci kullanicinin gereksinimlerine gore degiskenlik gosterebilecek kod parcalarinin kullanici tarafindan tamamlanmasini mumkun kilarak yazilim cercevelerinin cokbicimli kullanilabilmesini saglamak ve boylece daha yuksek yeniden kullanim elde etmektir Ornek olarak gorsel arayuzlu bir yazilimi kullanirken yaptiklarinizi dusunun dugmelere basiyorsunuz metin kutularini dolduruyorsunuz listelerden secimler yapiyorsunuz vs Ancak dugmenin ve diger gorsel ogelerin davranisi temelde degismedigi halde dugmeye basildiginda programin amacina donuk seyler oluyor Mesela ogrenci kayit formunun doldurulmasi sonrasinda tiklanan Tamam dugmesi ogrenci kaydini yaparken kitap alisverisi sitesindeki ayni gorunuslu dugmeyi tiklamaniz kitaplarin evinize kadar gelmesini saglayan bir surecin baslamasina neden oluyor Tiklamak eylemi ayniyken olup biten degisiyor ve bunun gorsel arayuz kitapligini ureten firma tarafindan bilinmesi olanaksiz resmin sizin kullandiginiz yazilimi ogrenci kayit ve kitap alisveris yazilimlari uretenler tarafindan doldurulmasi gerekli Iste bu yordamsal programlama dillerinde altyordam gostericilerine uygun altyordamlarin adreslerini gecirerek saglanirken nesne yonelimli dillerde yazilim cercevesince saglanan ustsiniflardan kalitlama veya arayuzleri gerceklestirme ile saglanabilir Ustsiniftan kalitlama veya arayuz gerceklestirme senaryosunun gecerli oldugu durumlarda bir nesneye gonderilen ileti sonucunda hangi metodun cagrilacagini belirleyen asagidaki adimlarin akilda tutulmasi yararli olacaktir Iletinin uygunlugu tutacak gosterici veya referans da olabilir turunun statik tur destekledigi iletilerle denetlenir Derleme sirasinda yapilan bu denetim ileti ve metot imzalarinin uyusup uyusmadigina bakar Uyusmanin olmamasi durumunda derleme hata mesaji vererek basarisiz bir bicimde sona erecek ve bir sonraki adima gecilmeyecektir Tutacagin temsil ettigi nesnenin sinifina dinamik tur bakarak hangi metodun cagrilacagina karar verilir Bu karar nesnenin sinifinda gerceklestirilen veya ustsiniflardan kalitlanan metotlardan biri secilerek programin calismasi sirasinda verilir Programlama Dilleri ve Dinamik IletimC Kabarcik siralamasi algoritmasinin C programlama dilindeki gerceklestirimini iceren asagidaki kabarcik siralama fonksiyonunun imzasinda iki nokta dikkat cekiyor fonksiyon gostericisi ve eleman turu olarak void ile esanlamli ilan edilmis olan Object Bunlardan ilki dizinin eleman turune ve veya siralama fonksiyonunun kullanilis baglamina gore farkli bicimlerde siralanmasini olanakli kilarken ikincisi dizinin herhangi bir turden eleman tutabilmesini yani dizinin soysal olmasini sagliyor Kabarcik h ifndef KABARCIK H define KABARCIK H typedef void Object typedef int KARSILASTIRMA FONK Object Object extern void kabarcik siralama Object dizi int boy KARSILASTIRMA FONK kar fonk endif Yukarida saglanan imzaya uygun gerceklestirime goz atildiginda ise isin puf noktasinin fonksiyon gostericisinin kullanildigi icteki dongunun ilk satirinda oldugu gorulur Her ne kadar kar adindaki bir fonksiyonun cagrilmasi ile ayni gorunse de aslinda bu satirda kar adli fonksiyon gostericisinin sahip oldugu degerin isaret ettigi bellek konumunda baslayan bir fonksiyon cagrilmaktadir kabarcik siralama fonksiyonunun cagrildigi noktalarda kar parametresine degisik degerlere sahip gostericilerin gecirilmesi farkli karsilastirma olcutlerinin kullanilmasi ve dolayisiyla siralamanin farkli turler ve veya bicimlerde yapilmasi anlamina gelecektir Kabarcik c include lt stdio h gt include Kabarcik h define BOOL char define FALSE 0 define TRUE 1 static void takas et Object dz int sol indis int sag indis Object gecici dz sol indis dz sol indis dz sag indis dz sag indis gecici void takas et Object int int sonu void kabarcik siralama Object dz int boy KARSILASTIRMA FONK kar int gecis j for gecis 1 gecis lt boy gecis BOOL takas var FALSE for j 0 j lt boy gecis j if kar dz j dz j 1 gt 0 takas et dz j j 1 takas var TRUE if sonu if takas var return for gecis 1 gecis lt boy gecis sonu void kabarcik siralama Object int KARSILASTIRMA FONK sonu Asagida saglanan sinama programinin incelenmesi olup bitenin daha iyi anlasilmasini saglayacaktir kabarcik siralama fonksiyonunun ilk kullanilisi Integer turlu elemanlari olan bir diziyi karsilastirma amaciyla int kars fonksiyonundan yararlanarak siralarken ikinci kullanilis komut satirinda gecirilen karakter katari dizisini karsilastirmak icin karakter katari kars fonksiyonundan yararlanarak siraliyor Kabarcik Sinama c include lt stdio h gt include lt string h gt include Kabarcik h typedef int Integer void ksa bas char ksa int boy void intleri bas Integer dz int boy int karakter katar kars Object sol Object sag return strcmp char sol char sag int karakter katar kars Object Object sonu int int kars Object sol Object sag Integer ig1 Integer sol Integer ig2 Integer sag if ig1 gt ig2 return 1 else if ig1 lt ig2 return 1 else return 0 int int kars Object Object sonu int main int args char ksa int dizi 1 3 102 6 34 12 35 i Integer int dz 7 for i 0 i lt 7 i int dz i amp dizi i printf n TAMSAYI DIZISI SINANIYOR n n Siralama oncesi n intleri bas int dz 7 kabarcik siralama Object int dz 7 amp int kars printf n Siralama sonrasi n intleri bas int dz 7 printf n KARAKTER KATARI DIZISI SINANIYOR n n Siralama oncesi n ksa bas amp ksa 1 args 1 kabarcik siralama Object amp ksa 1 args 1 karakter katari kars printf Siralama sonrasi n ksa bas amp ksa 1 args 1 return 0 int main int char sonu C C nin nesne yonelimli ardili olan C da dinamik iletim fonksiyon gostericilerine ek olarak ustsinifta b virtual b ilan edilen bir fonksiyonun altsiniflarda ihtiyaca uygun bir bicimde gerceklestirilmesi veya ezilmesi ile saglanir Varsayilan iletim biciminin statik olmasi nedeniyle soz konusu fonksiyonun b virtual b ilan edilmemesi dinamik iletimi ve dolayisiyla cokbicimliligi engelleyecektir Unutulmamasi gereken bir diger nokta cokbicimliligin ustsinif turunden bir gosterici veya referans bir baska deyisle derleyici tarafindan ozel bir bicimde ele alinan sabit gosterici ile mumkun oldugudur Bu ustsinif ve altsinif nesnelerinin muhtemelen degisik buyukluklerde olmasi buyuklugu calisma aninda belirlenebilen bellek bolgelerinin yigin bellekten ayrilmasi gerekliligi ve yigin bellegin ancak gostericiler ile islenebilmesi nedeniyle zorunludur Memur hxx ifndef MEMUR HXX define MEMUR HXX class Memur public virtual double aylik gelir 0 Memur sinifinin sonu endif Ikinci asamada yapilmasi gereken dinamik iletimli cagrilacagi icin b virtual b ilan edilmis olan fonksiyonlarin altsiniflarda tanimlanmakta olan turlerin ozelliklerini goz onunde bulundurarak gerceklestirmektir GenelMudur hxx ifndef GENELMUDUR HXX define GENELMUDUR HXX include Memur hxx class GenelMudur public Memur endif GenelMudur c include GenelMudur hxx double GenelMudur aylik gelir Geliri derece kademe ve alinabilecek rusveti hesaba katarak hesapla double GenelMudur aylik gelir sonu DuzMemur hxx ifndef DUZMEMUR HXX define DUZMEMUR HXX include Memur hxx class DuzMemur public Memur endif DuzMemur c include DuzMemur hxx double DuzMemur aylik gelir Geliri derece ve kademeden yararlanarak hesapla double DuzMemur aylik gelir sonu Dinamik iletimli fonksiyonun cokbicimli kullanimina bir ornek asagidaki kod parcasindan gorulebilir Dikkat edilecek olursa memurlar adindaki kabin eleman turu ustsinifin referans turune sahip tanimlanmis Dolayisiyla soz konusu kap Memur veya Memur gibi olan yani Memur dan kalitlayan herhangi bir turden nesneyi gosteren referanslar tutacaktir Bordro cpp include lt vector gt using namespace std include Memur hxx include GenelMudur hxx include DuzMemur hxx int main void vector lt Memur amp gt memurlar double toplam odeme 0 vector lt Memur amp gt const iterator bas memurlar begin son memurlar end while bas son toplam odeme bas aylik gelir bas while bas son sonu int main void sonu Java Java da b final b ilan edilerek aksi soylenmedikce tum metotlar dinamik iletimle cagrilir Dolayisiyla programcinin fazladan bir sey yapmasina gerek yoktur Kalitlama Yoluyla Cokbicimlilik ve Dinamik Iletim Memur javapublic abstract class Memur public double gelir Memur sinifinin sonu GenelMudur javapublic class GenelMudur extends Memur public double gelir Geliri derece kademe ve alinabilecek rusveti hesaba katarak hesapla GenelMudur sinifinin sonu DuzMemur javapublic class DuzMemur extends Memur public double gelir Geliri derece ve kademeden yararlanarak hesapla DuzMemur sinifinin sonu Kalitlama yoluyla cokbicimliligin orneklendigi asagidaki kod parcasindan da gorulebilecegi gibi gonderilen ileti sonucunda cagrilan metot tutacagin arkasindaki nesnenin turune gore belirlenmektedir Buna gore b for b dongusunun icindeki gelir iletisi kimi zaman GenelMudur kimi zamansa DuzMemur sinifindaki ayni imzali metodun cagrilmasina neden olacaktir Bordro javaimport java util Vector public class Bordro Vector lt Memur gt calisanlar new Vector lt Memur gt double toplamOdeme 0 for Memur calisan calisanlar toplamOdeme calisan gelir Bordro sinifinin sonu Gerceklestirme Yoluyla Cokbicimlilik ve Dinamik Iletim Java turleri siniflar ve arayuzler gibi olmak iliskisine gore bir siraduzenine koyan kalitlama iliskisinin yani sira siniflari sahip olduklari ortak arayuzlere gore kategorize eden gerceklestirme iliskisini de sunar Gerceklestirme iliskisi yoluyla dinamik iletimin kullanilmasi ve metotlarin cokbicimli bir sekilde kullanilmasi birbirleriyle benzer olsun veya olmasin ayni kategoriye giren siniflarin ortak bir arayuzu gerceklestirmesi ile mumkun olur Ogrenci javapackage ogrenciisleri public class Ogrenci implements Comparable lt Ogrenci gt pubic int compareTo Ogrenci sag Ogrenci sinifinin sonu Vatandas javapackage gelirvergisi public class Vatandas implements Comparable lt Vatandas gt public int compareTo Vatandas sag Vatandas sinifinin sonu Algoritmalar javapackage algoritmalar import java util public class Siralamalar public static lt V extends Comparable lt extends V gt gt void kabarcik List lt V gt kap if kap length lt 1 return boolean takasVar false int gecis 1 do takasVar false for int j 0 j lt kap length gecis j V oAnki kap get j sonraki kap get j 1 if oAnki compareTo sonraki gt 0 V gecici oAnki oAnki sonraki sonraki gecici takasVar true if oAnki compareTo sonraki gt 0 sonu for int j 0 j lt kap length gecis j sonu while gecis lt kap length amp amp takasVar lt V extends Comparable lt V gt gt void kabarcik List lt V gt sonu Siralamalar sinifinin sonu AlgoritmaSinama javaimport gelirvergisi import ogrenciisleri import static algoritmalar Siralamalar public class AlgoritmaSinama kabarcik ogrenciler kabarcik vergiMukellefleri AlgoritmaSinama sinifinin sonu Scheme Fonksiyonel programlama dillerinden olan Scheme de dinamik iletim altyordamlarin birinci sinif muamele gormesi nedeniyle oldukca kolay saglanir Altyordam turlerinin varligi altyordamlarin arguman olarak gecirilmesini ve altyordamlardan sonuc olarak dondurulmesini olanakli kilar Bunun sonucunda cokbicimli davranmasi beklenen altyordama degisik altyordamlarin gecirilmesi isimizi gorecektir Ornegin asagidaki kabarcik siralamasi gerceklestirimine ikinci arguman olarak gt gecirilmesi ilk argumandaki sayi dizisinin artan sirada siralanmasi saglarken string lt gecirilmesi ilk argumandaki karakter katari dizisinin azalan sirada siralanmasini saglayacaktir define kabarcik alg dz oncemi define eleman takas dz i j let gecici vector ref dz i vector set dz i vector ref dz j vector set dz j gecici define gecis ub do i 0 i 1 takas f i ub 1 takas when oncemi vector ref dz i 1 vector ref dz i eleman takas dz i i 1 set takas t do j vector length dz j 1 takas t gecis j or not takas j 1 dz Notlar Adres islecinin amp kullanimlardan birinde olup digerinde olmamasi sizi sasirtmasin Her iki durumda da gecirilen deger soz konusu fonksiyonun baslangic adresini isaret eden bir gosterici degeri olacaktir Gerceklestirimi saglanmayan dinamik iletimli bir fonksiyonunun bulunmasi Memur sinifini bir soyut sinif Ingilizce abstract class yapiyor Dolayisiyla kabimiz icindeki referanslarin Memur nesnelerini gostermesi soyut bir sinifin nesneleri yaratilamayacagi icin soz konusu olmayacaktir Ayrica bakinizCokbicimlilik Gerceklestirme iliskisiDis baglantilarGeri cagri Ingilizce 6 Mayis 2011 tarihinde Wayback Machine sitesinde arsivlendi Havaleciler NET te tur guvenlikli geri cagrilar Ingilizce 11 Aralik 2011 tarihinde Wayback Machine sitesinde arsivlendi Dinamik iletim Ingilizce 31 Mart 2011 tarihinde Wayback Machine sitesinde arsivlendi Dinamik iletimli fonksiyonlar Ingilizce 2 Ekim 2011 tarihinde Wayback Machine sitesinde arsivlendi