Java
Arayüz kavramınıinterface
yapısı ile doğrudan destekleyen Java
'da programcının yapacağı olası bir hata kavramdan haberdar derleyici sayesinde önlenir. Programlama dili standardındaki tanımlara uygun gerçekleştirilmiş derleyiciler, metot gövdesi ve altalan tanımı gibi gerçekleştirim ayrıntısı olarak addedilen programlama öğelerinin arayüze konulmasına izin vermez. Ayrıca, standart görevi görme ve kullanıcı kodu ile gerçekleştirimci arasında sözleşme tanımlama özelliklerinin bir sonucu olarak, arayüz tanımında yer alan tüm öğelerinpublic
erişime sahip olduğu kabul edilir. Dolayısıyla, erişim niteleyicilerinin konulmasına gerek yoktur. Arayüz tanımının derlenip sınıf yolu üzerinde uygun bir yere konulması sonrasında yapılması gereken, söz konusu kategoriye giren kavramların karşılığı olan sınıflarda bu arayüzün, belki de diğer arayüzlerle birlikte, gerçekleştirilmesidir. Bu noktada, arayüz(ler) ve sınıf arasındaki gerçekleştirme ilişkisinin bir taahhüt olduğu ve arayüz(ler)de listelenen tüm iletilerin gerçekleştirilmesi gerektiği unutulmamalıdır.
C
omparableIKesirliSayı
ve C
omparable
arayüzlerinin gerçekleştirimine örnek olarak yukarıda sunulan iskeletin içi değişik şekillerde doldurulabilir. Ancak, ayrıntıda farklılık gösteren tüm sınıfların ortak bir özelliği olacaktır: gerçekleştirdikleri IKesirliSayı
ve C
omparable
arayüzleri. Bu ise, söz konusu sınıfların nesnelerinin, yukarıda da anlatıldığı gibi, IKesirliSayı
veya C
omparable
arayüzü türündeki tutacaklar vasıtasıyla çokbiçimli bir şekilde kullanılabileceği anlamına gelir. (Java
'da arayüzler hakkında daha ayrıntılı bilgi için, buraya bakınız)C
++ Arayüz kavramını doğrudan desteklemeyenC
++ programlama dilinde programcıların belirli kurallara uyulan sınıf tanımlarıyla bu eksiği gidermeleri mümkündür. Öncelikle, altyordam gövdelerinin sağlanmaması koşulu, tüm fonksiyon tanımlarının dinamik iletimli boş fonksiyonlar (İng., pure virtual) olarak yapılması gerektiği anlamını taşır. Bu koşula uyulmaması, yapılmakta olan tanımı soyut/somut sınıf tanımına dönüştürür. Bir diğer önemli nokta ise, arayüzdeki tüm öğelerin kamuya açık ilan edilmesinin sonucudur: sınıf tanımının hemen başınapublic:
konulması bir alışkanlık haline getirilmeli ve gerçekleştirim ayrıntısı olmanın habercisi diğer erişim niteleyicilerinden kaçınılmalıdır. Ayrıca, kullanıcı ile paylaşılacak olan arayüz tanımının C
++ kaynak dosyası yerine başlık dosyasına konulması da iyi bir alışkanlık olacaktır.C
omparable.hxxC
OMPARABLE_HXX #define IC
OMPARABLE_HXX namespace sistem ; // IC
omparable arayuzunun sonu } // sistem aduzayinin sonu #endifTanımların tamamlanması ve ilişkin başlık dosyalarının kütük dizgesinde uygun yerlere konulması sonrasında sıra arayüzlerin gerçekleştirimine gelir. Arayüz kavramını desteklemeyen
C
++, doğal olarak, gerçekleştirme ilişkisinden de haberdar değildir. Dolayısıyla, gerçekleştirme ilişkisi yerine kalıtlama ilişkisini koymamız gerekecektir.C
omparable.hxx" using namespace sistem; #include "matematik/IKesirliSayi.hxx" #include "matematik/ayriksidurumlar/SifirBolen.hxx" using namespace matematik::ayriksidurumlar; namespace matematik IKesirliSayi carp(IKesirliSayi) IKesirliSayi cikar(IKesirliSayi) IKesirliSayi topla(IKesirliSayi) long bolen(void) long bolunen(void) double deger(void) int compareTo(IKesirliSayi digerSayi) ... }; // KesirliSayi sinifinin sonu } // matematik aduzayinin sonuArayüz ve bu arayüzü gerçekleştiren sınıfın kullanımına gelindiğinde bir noktanın unutulmaması yararlı olacaktır. Dinamik iletimli fonksiyonların çokbiçimli kullanılabilmesi için nesnelerin referans veya gösterici aracılığıyla kullanılması gerekir. Aksi takdirde, tüm çağrılar çalışma öncesinde bağlanacak ve kodun çokbiçimli kullanılması söz konusu olmayacaktır.
C
Yordamsal bir dil olanC
, nesne paradigmasının gerektirdiği en temel kavramları dahi desteklemez. Dolayısıyla, sınıf, arayüz gibi dil düzeyi kavramların işletim dizgesi kavramı olan dosyadan yararlanarak gerçekleştirilmesi zorunludur. Genel strateji,C
++'da uygulanan ile aynıdır: başlık dosyasında tanımlanan arayüzünC
dosyasında gerçekleştirilmesi. Arayüz tanımında, gerçekleştirim ayrıntısı ele vermemek adına, dinamik iletimli çağrılacak fonksiyonların adreslerini tutan yapının dışında tanım verilmemeli, statik iletimli çağrılacak fonksiyonlarınextern
ile nitelenerek verilen deklarasyonu ile yetinilmelidir. Ayrıca, fonksiyonların işleyeceği ortak bir bellek bölgesi söz konusu ise, bunun tanımının da deklarasyon ile geçiştirilmesi ve asıl tanımın C
dosyasına bırakılması gereklidir. Son olarak, nesne paradigmasında alıcı nesneyi temsilen tüm iletilere geçirilen saklı argüman (this
veya self
), derleyicinin nesne kavramından haberdar olmadığı düşünülerek, tüm fonksiyonlara ayrıca geçirilmelidir. C
ARP)(IKesirliSayi ileti_alici, IKesirliSayi digerSayi); typedef IKesirliSayi (*C
IKAR)(IKesirliSayi ileti_alici, IKesirliSayi digerSayi); typedef IKesirliSayi (*TOPLA)(IKesirliSayi ileti_alici, IKesirliSayi digerSayi); typedef long (*PAY)(IKesirliSayi ileti_alici); typedef long (*PAYDA)(IKesirliSayi ileti_alici); typedef double (*DEGER)(IKesirliSayi ileti_alici); typedef struct _ARAYUZ_KESIRLISAYI *KesirliSayi_Arayuzu; #endifC
omparable.hC
OMPARABLE_H #define IC
OMPARABLE_H typedef void* Object; typedef int (*C
OMPARETO)(Object, Object); typedef struct _ARAYUZ_IC
OMPARABLE *C
omparable_Arayuzu; #endifGerçekleştirim kısmına geldiğimizde, nesne yönelimli dillerde derleyiciler tarafından yapılan bazı şeyleri programcının yapması gerektiği unutulmamalıdır. Örneğin, nesnenin özelliklerine göre sağlanan fonksiyon gerçekleştirimleri ile fonksiyon göstericileri ilklenmeli—yani, vtable programcı tarafından oluşturulmalı—yığın bellekten yer ayrımı işi yapıcı içinde yapılmalı ve nesnemiz ne kadar basit bir yapıya sahip olursa olsun yıkıcı görevini görecek bir fonksiyon yazılmalıdır.