C# Interface(Arayüz)
Şimdi bu sayfada C# üzerinden interface yapısınının nasıl kurulduğunu anlatacağım.Öncelikle class yerine interface yazmamız gerekiyor.Aşağıdaki bir interface yapısıdır.
interface ISeriler
{
}
Şimdi bir senaryo yazalım.
Benim bir yazılım şirketim olsun.Adları Ahmet ve Ayşe olan iki çalışanım olsun.Şimdi toplantıda Ahmet ve Ayşe’ye yapacağımız projeden bahsedeceğim.Elimde aşağıdaki gibi bir interface im var.
interface ISeriler
{
int SonrakiniGetir();
int Sınıfla();
int BaslangicDegeriniVer(int baslangic);
int Sonraki
{
get;
/*Bu sınıftan kalıtım alan sınıf bu propertyi mecbur kullanacaktır.Ve bu propertyde sadece get bloğu mecbur olacaktır.
set bloğunuda kafamıza göre yazalım dersek onu kabul etmeyecektir.Abstract sınıfındaki farklardan biri budur.*/
}
}
Yukarıda gördüğünüz interface yapısını inceleyiniz.Bütün elemanların erişim belirleyicileri yazılmamıştır.Ve metodların ve propertydeki get setlerin gövdeleri tanımlanmamıştır.Bunların hepsi Interfacein kurallarıdır.Bu sınıftan kalıtım alacak olan sınıfta hem erişim belirleyicileri tanımlanacak , hem de elemanların gövdeleri yazılacaktır.Neyse senaryoya devam edelim.
Ahmet ve Ayşe bu interfacei incelerken ,bir yandan beni dinlemektedirler.”Ahmet ve Ayşe bu interfacei kullanıp,ikiser ikiser ve üçer üçer sayma yapan programları yazmanızı istiyorum.Ahmet sen ikiser ikiser sayacak olan programı , Ayşe sende üçer üçer sayacak olan programı yaz.” diyorum.Artık Ahmet ve Ayşe bu interface e bağlı olarak bu programları yazmak zorundadırlar.
Şimdi Ahmet’in yazdığı ikiser ikiser sayan classını inceleyelim.Ardında Ayşeye bakarız.
Ahmet bu classı IkiserIkiser.cs sayfasında tasarlıyor.
Ben şimdilik implement interface ‘ISeriler’ seçeneğini kullanarak implement etmeyi göstereceğim.Bu seçeneği seçtiğiniz zaman ISeriler interfaceindeki elemanlar aşağıdaki gibi gelecektir.
class IkiserIkiser:ISeriler
{
public int SonrakiniGetir()
{
throw new NotImplementedException();
}
public int Sınıfla()
{
throw new NotImplementedException();
}
public int BaslangicDegeriniVer(int baslangic)
{
throw new NotImplementedException();
}
public int Sonraki
{
get { throw new NotImplementedException(); }
}
}
Yukarıda gördüğünüz şekilde gelen elemanları , Ahmet istediği şekilde programlıyor.(içindeki throw lu ifadeleri silip kendi yazıyor)
class IkiserIkiser:ISeriler
{
int baslangic;
int deger;
//Gördüğünüz gibi kalıtım alan sınıfta , interfacede olmayan elemanlar yazılabiliyor.
public int SonrakiniGetir()
{
deger = deger + 2;
return deger;
}
public int Sınıfla()
{
baslangic = 0;
deger = baslangic;
return deger;
}
public int BaslangicDegeriniVer(int baslangic)
{
this.baslangic = baslangic;
deger = baslangic;
return deger;
}
public int Sonraki
{
get
{
return SonrakiniGetir();
}
}
}
Artık Ahmet interfacee uygun halde classını kodlamıştır.Şimdi Ayşe’nin yaptığı işe bakalım.
Ayşe ise interfacedeki elemanları UcerUcer.cs classında tasarlıyor.
implement interface ‘ISeriler’ ile ISeriler intefaceinden elemanları implement ediyor.Ve aşağıdaki classı programlıyor.
class UcerUcer:ISeriler
{
int baslangic;
int deger;
public int SonrakiniGetir()
{
deger = deger + 3;
return deger;
}
public int Sınıfla()
{
baslangic = 0;
deger = baslangic;
return deger;
}
public int BaslangicDegeriniVer(int baslangic)
{
this.baslangic = baslangic;
deger = baslangic;
return deger;
}
public int Sonraki
{
get
{
return SonrakiniGetir();
}
}
}
Ahmet ve Ayşe interface e uygun classlarını tasarladılar ve önüme koydular.Şimdi şunlara dikkat etmenizi istiyorum.İkiside aynı interfacei kullandıkları için ikisinin classında da metodlar,propertyler vs. gibi elemanların isimleri aynı oldu.Yani Ahmet’in yazdığı IkiserIkiser.cs classında int baslangic parametresi alan BaslangicDegeriniVer() metodu varken, Ayşe’nin yazdığı UcerUcer.cs classında da int baslangic parametresi alan ve BaslangicDegeriniVer() metodu var.
Şimdi bir müşteri gelip benden ikişer ikişer sayan bir program istedi.Ben hemen IkiserIkiser.cs sınıfını kullarak bir program hazırlıyorum.
IkiserIkiser nesne = new IkiserIkiser();
nesne.BaslangicDegeriniVer(2);
for (int i = 0; i < 5; i++)
{
MessageBox.Show(nesne.SonrakiniGetir().ToString());
}
Ve aynı müşteri gelip, ikişer ikişer sayan programdan vaz geçtiğini, üçer üçer sayan program istediğini söyledi.Bende yeni bir program yazana kadar yukarıdaki kodların sadece sınıf adını değiştiriyorum.
UcerUcer nesne = new UcerUcer();
nesne.BaslangicDegeriniVer(2);
for (int i = 0; i < 5; i++)
{
MessageBox.Show(nesne.SonrakiniGetir().ToString());
}
Interfacein bize sağladığı esnekliğin farkına varmışsınızdır umarım.
Buraya kadar ki kısım interfacee giriş niteliği taşımaktadır.Bir sonraki sayfada olası bir kaç durumdan bahsedeceğim.



1 Cevap
[…] eğer Interface’ler üzerine zamanında yazmış olduğum makalemin name hiding ile ilgili şu adresteki bölümü okumanızı ve bu makaleye öyle devam etmenizi tavsiye […]