Arayüz (yazılım)
Programlama Dilleri ve Arayüz Kavramı > C

Yordamsal bir dil olan C, 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ün C 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ın extern 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.
#ifndef IKESIRLISAYI_H
#define IKESIRLISAYI_H

struct _IKESIRLISAYI;
typedef struct _IKESIRLISAYI* IKesirliSayi;

typedef IKesirliSayi (*BOL)(IKesirliSayi ileti_alici, IKesirliSayi digerSayi); // throws SifirBolen
typedef IKesirliSayi (*CARP)(IKesirliSayi ileti_alici, IKesirliSayi digerSayi);
typedef IKesirliSayi (*CIKAR)(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 {
  BOL bol;
  CARP carp;
  CIKAR cikar;
  TOPLA topla;
  DEGER deger;
  PAY pay;
  PAYDA payda;
} *KesirliSayi_Arayuzu;
#endif
#ifndef ICOMPARABLE_H
#define ICOMPARABLE_H

typedef void* Object;
typedef int (*COMPARETO)(Object, Object);

typedef struct _ARAYUZ_ICOMPARABLE {
  COMPARETO compareTo;
} *Comparable_Arayuzu;
#endif
Gerç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, vtable22 Temmuz 2010 tarihinde Wayback Machine sitesinde arşivlendi. 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.
#include <stdlib.h>
#include "matematik/IKesirliSayi.h"
#include "sistem/IComparable.h"

struct _IKESIRLISAYI {
  KesirliSayi_Arayuzu _ksa;
  Comparable_Arayuzu _ca;
  long _pay, _payda;
};

IKesirliSayi KesirliSayi_bol(IKesirliSayi ileti_alici, IKesirliSayi diger_sayi) { ... }

/* Diğer fonksiyon gerçekleştirimleri */

KesirliSayi_Arayuzu KesirliSayi_ksa_gosterici(void) {
  static KesirliSayi_Arayuzu gosterici = NULL;
  if (!gosterici) {
    gosterici = (KesirliSayi_Arayuzu) malloc(sizeof(struct _ARAYUZ_KESIRLISAYI));
    gosterici->bol = KesirliSayi_bol;
    /* Diğer fonksiyon göstericilerinin ilklenmesi */
  } /* if (!gosterici) */
  return gosterici;
} /* KesirliSayi_Arayuzu KesirliSayi_ksa_gosterici(void) sonu */

Comparable_Arayuzu KesirliSayi_ca_gosterici(void) {
  static Comparable_Arayuzu gosterici = NULL;
  if (!gosterici) {
    gosterici = (Comparable_Arayuzu) malloc(sizeof(struct _ARAYUZ_COMPARABLE));
    gosterici->compareTo = KesirliSayi_karsilastir;
  } * if (!gosterici) */
  return gosterici;
} /* KesirliSayi_Arayuzu KesirliSayi_ksa_gosterici(void) sonu */

IKesirliSayi KesirliSayi_yarat(long pay, long payda) {
  IKesirliSayi nesne = (IKesirliSayi) malloc(sizeof(struct _IKESIRLISAYI));
  nesne->_ksa = KesirliSayi_ksa_gosterici();
  nesne->_ca = KesirliSayi_ca_gosterici();
  nesne->_pay = pay;
  nesne->_payda = payda;

  return nesne;
} /* yapici(long, long) sonu */

void KesirliSayi_yik(IKesirliSayi* nesne) {
  if (*nesne == NULL) return;
  free(*nesne);
  *nesne = NULL;
} /* yikici sonu */
...
Arayüz tutacağı yoluyla çokbiçimlilik