Nesne yönelimli programlamanin en önemli yapilarindan biri interface yapisidir. Uygulamalarimizda interface kullanmanin iki sebebi olabilir:
1. Uygulamamiz için bir sinif olusturdugumuzu düsünelim. Bu sinif türünden bir yavru degisken olusturuldugunda sinifin içerisindeki elemanlara (fonksiyon, prosedür, property, degisken) bu degisken üzerinden erisilir. Fakat birden çok yerde sadece belirli bir grup elemani kullanmak istiyorum. Yani diger elemanlar isime yaramayacaktir. Baska bir yerde de diger elemanlari kullanmam gerekmektedir. O zaman isime yaramayan elemanlari almadan nasil bir yapi kullanacagim?
2. Bir siniftan sadece bir sinifa kalitim verebiliriz. Fakat bir sinifa iki veya daha fazla siniftan kalitim veremeyiz. Bu durumda interface yapisini kullanmamiz dogru olacaktir. Bir sinifa birçok interface ile kalitim verebiliriz.
Interface'in tanimlamasini kisaca hatirlayalim:
1. Interface içerisinde sadece fonksiyon, prosedür, indexer ve property tanimlamasi yapabiliriz.
2. Interface içerisinde degisken tanimlamasi yapilmaz!!!
3. Interface isimleri tavsiye edildigi sekilde, 'I' harfi ile baslar..
Bir örnek ile konumuzu daha iyi kavramaya çalisalim:
Örnegimizde bir üniversitedeki ögretim görevlileri ve ögrencilerin bilgilerine ulasilmak isteniyor. Ögretim görevlileri için OgretimGorevlisi, ögrenci için ise Ogrenci siniflari olusturulmustur. Bunlarin kisisel bilgilerine ulasabilmek için IKisiBilgileri interface'i ve çalisan kisilerin çalisma bilgilerine ulasabilmek için ICalisanBilgileri interface'i olusturulmustur.
Dikkat edilmesi gereken nokta su: Ögrenci okul içerisinde bir kisidir. Ögretim görevlisi ise hem kisi hem de çalisandir.
Öncelikle interface'lerimizi inceleyelim:
interface IKisiBilgileri
{
string AdSoyad { get; set; }
string EPosta { get; set; }
string Telefon { get; set; }
}
interface ICalisanBilgileri
{
string Departman { get; set; }
string Gorev { get; set; }
}
IKisiBilgileri interface'inde kisinin adi soyadi, e-posta adresi ve telefon numarasi bilgilerine ulasiliyor. ICalisanBilgileri interface'inde ise çalisan kisinin departmani ve görevi bilgilerine ulasiliyor.
Simdi Ogrenci ve OgretimGorevlisi siniflarinin kodlarini inceleyelim:
class Ogrenci :IKisiBilgileri
{
private string adSoyad, ePosta, telefon;
private double not;
public string AdSoyad
{
get { return adSoyad; }
set { this.adSoyad = value; }
}
public string EPosta
{
get { return this.ePosta; }
set { this.ePosta = value; }
}
public string Telefon
{
get { return this.telefon; }
set { this.telefon = value; }
}
public double Not
{
get { return this.not; }
set { this.not = value; }
}
}
Ögrenci bir kisi oldugu için sadece IKisiBilgileri interface'inin kalitimini aldi ve bu interface içerisindeki property'ler sinif içerisinde olusturuldu.
Ögretim görevlisi hem kisi hem de çalisan oldugu için ICalisanBilgileri ve IKisiBilgileri interface'lerinin kalitimini aldi ve içerisindeki property'ler sinif içerisinde olusturuldu.
class OgretimGorevlisi : ICalisanBilgileri, IKisiBilgileri
{
private string adSoyad, ePosta, telefon, departman, gorev, unvan;
public string Departman
{
get { return this.departman; }
set {this.departman = value; }
}
public string Gorev
{
get { return this.gorev; }
set { this.gorev = value; }
}
public string AdSoyad
{
get { return adSoyad; }
set { this.adSoyad = value; }
}
public string EPosta
{
get { return this.ePosta; }
set { this.ePosta = value; }
}
public string Telefon
{
get { return this.telefon; }
set { this.telefon = value; }
}
public string Unvan
{
get { return this.unvan; }
set { this.unvan= value; }
}
}
Class ve Interface'lerimizi olusturduk. Simdi bunlari nasil kullanacagimiza bakalim:
Öncelikle Ogrenci türünde bir degisken olusturalim:
Yukarida görüldügü gibi, Ogrenci türünde tanimlanan ogrenci isimli yavru degisken üzerinden bütün property'lere erisebiliyoruz.
Simdi OgretimGorevlisi türünde bir degisken olusturalim:
Yukarida görüldügü gibi, OgretimGorevlisi türünde tanimlanan ogrGor isimli yavru degisken üzerinden bütün property'lere erisebiliyoruz.
Simdi Interface'i nasil kullanacagimizi görelim. Ogrenci sinifina IKisiBilgileri interface'inin kalitimini vermistik. IKisiBilgileri türünde ogrenci isminde bir degisken tanimlayip ona bellekte Ogrenci türünde yer ayiriyorum:
IKisiBilgileri isimli Interface türünden, Ogrenci sinifinin metodlarini kullanarak bir yavru degisken olusturduk. Dikkat edin, bu degisken üzerinden sadece IKisiBilgileri'nde tanimlanan, Ogrenci sinifina ait olan property'leri görebiliyoruz. iste interface'in kullanim alanlarinin 1. maddesini yerine getirmis olduk, yani sadece isimize yarayan kismini aldik, digerlerine ulasamadik.
Simdi IKisiBilgileri türünde ogrGor isminde bir degisken tanimlayip ona bellekte OgretimGorevlisi türünde yer ayiralim:
Yukarida gördügünüz gibi sadece IKisiBilgileri içerisinde tanimlanan ve OgretimGorevlisi sinifina ait property'leri görebiliyoruz.
Son olarak ICalisanBilgileri türünde bir degisken tanimlayip bellekte OgretimGorevlisi türünde yer ayiralim:
Burada da sadece ICalisanBilgileri'nde tanimlanan property'lere ulasabildik.
Veysel Ugur KIZMAZ