Nesne yönelimli programlamanın en önemli yapılarından biri interface yapısıdır. Uygulamalarımızda interface kullanmanın iki sebebi olabilir:
1. Uygulamamız için bir sınıf oluşturduğumuzu düşünelim. Bu sınıf türünden bir yavru değişken oluşturulduğunda sınıfın içerisindeki elemanlara (fonksiyon, prosedür, property, değişken) bu değişken üzerinden erişilir. Fakat birden çok yerde sadece belirli bir grup elemanı kullanmak istiyorum. Yani diğer elemanlar işime yaramayacaktır. Başka bir yerde de diğer elemanları kullanmam gerekmektedir. O zaman işime yaramayan elemanları almadan nasıl bir yapı kullanacağım?
2. Bir sınıftan sadece bir sınıfa kalıtım verebiliriz. Fakat bir sınıfa iki veya daha fazla sınıftan kalıtım veremeyiz. Bu durumda interface yapısını kullanmamız doğru olacaktır. Bir sınıfa birçok interface ile kalıtım verebiliriz.
Interface'in tanımlamasını kısaca hatırlayalım:
1. Interface içerisinde sadece fonksiyon, prosedür, indexer ve property tanımlaması yapabiliriz.
2. Interface içerisinde değişken tanımlaması yapılmaz!!!
3. Interface isimleri tavsiye edildiği şekilde, 'I' harfi ile başlar..
Bir örnek ile konumuzu daha iyi kavramaya çalışalım:
Örneğimizde bir üniversitedeki öğretim görevlileri ve öğrencilerin bilgilerine ulaşılmak isteniyor. Öğretim görevlileri için OgretimGorevlisi, öğrenci için ise Ogrenci sınıfları oluşturulmuştur. Bunların kişisel bilgilerine ulaşabilmek için IKisiBilgileri interface'i ve çalışan kişilerin çalışma bilgilerine ulaşabilmek için ICalisanBilgileri interface'i oluşturulmuştur.
Dikkat edilmesi gereken nokta şu: Öğrenci okul içerisinde bir kişidir. Öğretim görevlisi ise hem kişi hem de çalışandır.
Ö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 kişinin adı soyadı, e-posta adresi ve telefon numarası bilgilerine ulaşılıyor. ICalisanBilgileri interface'inde ise çalışan kişinin departmanı ve görevi bilgilerine ulaşılıyor.
Şimdi Ogrenci ve OgretimGorevlisi sınıflarının kodlarını 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; }
}
}
Öğrenci bir kişi olduğu için sadece IKisiBilgileri interface'inin kalıtımını aldı ve bu interface içerisindeki property'ler sınıf içerisinde oluşturuldu.
Öğretim görevlisi hem kişi hem de çalışan olduğu için ICalisanBilgileri ve IKisiBilgileri interface'lerinin kalıtımını aldı ve içerisindeki property'ler sınıf içerisinde oluşturuldu.
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 oluşturduk. Şimdi bunları nasıl kullanacağımıza bakalım:
Öncelikle Ogrenci türünde bir değişken oluşturalım:

Yukarıda görüldüğü gibi, Ogrenci türünde tanımlanan ogrenci isimli yavru değişken üzerinden bütün property'lere erişebiliyoruz.
Şimdi OgretimGorevlisi türünde bir değişken oluşturalım:

Yukarıda görüldüğü gibi, OgretimGorevlisi türünde tanımlanan ogrGor isimli yavru değişken üzerinden bütün property'lere erişebiliyoruz.
Şimdi Interface'i nasıl kullanacağımızı görelim. Ogrenci sınıfına IKisiBilgileri interface'inin kalıtımını vermiştik. IKisiBilgileri türünde ogrenci isminde bir değişken tanımlayıp ona bellekte Ogrenci türünde yer ayırıyorum:

IKisiBilgileri isimli Interface türünden, Ogrenci sınıfının metodlarını kullanarak bir yavru değişken oluşturduk. Dikkat edin, bu değişken üzerinden sadece IKisiBilgileri'nde tanımlanan, Ogrenci sınıfına ait olan property'leri görebiliyoruz. işte interface'in kullanım alanlarının 1. maddesini yerine getirmiş olduk, yani sadece işimize yarayan kısmını aldık, diğerlerine ulaşamadık.
Şimdi IKisiBilgileri türünde ogrGor isminde bir değişken tanımlayıp ona bellekte OgretimGorevlisi türünde yer ayıralım:

Yukarıda gördüğünüz gibi sadece IKisiBilgileri içerisinde tanımlanan ve OgretimGorevlisi sınıfına ait property'leri görebiliyoruz.
Son olarak ICalisanBilgileri türünde bir değişken tanımlayıp bellekte OgretimGorevlisi türünde yer ayıralım:

Burada da sadece ICalisanBilgileri'nde tanımlanan property'lere ulaşabildik.
Veysel Uğur KIZMAZ
veysel.ugurkizmaz.com