Veysel Uğur KIZMAZ

Java ile Interface Kullanımı

04.04.2012Okunma Sayısı: 22907Kategori: Java

 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, 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 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:
 
public interface IKisiBilgileri {
      public String getAdSoyad();
      publicvoid setAdSoyad(String adSoyad);
      //
      public String getEPosta();
      publicvoid setEPosta(String ePosta);
      //
      public String getTelefon();
      publicvoid setTelefon(String telefon);
}
 
publicinterface ICalisanBilgileri {
      public String getDepartman();
      publicvoid setDepartman(String departman);
      //
      public String getGorev();
      publicvoid setGorev(String gorev);
}
 
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:
 
publicclass Ogrenci implements IKisiBilgileri {
 
      private String adSoyad;
      private String ePosta;
      private String telefon;
     
      @Override
      public String getAdSoyad() {
            returnthis.adSoyad;
      }
 
      @Override
      publicvoid setAdSoyad(String adSoyad) {
            this.adSoyad = adSoyad;
      }
 
      @Override
      public String getEPosta() {
            returnthis.ePosta;
      }
 
      @Override
      publicvoid setEPosta(String ePosta) {
            this.ePosta = ePosta;
      }
 
      @Override
      public String getTelefon() {
            returnthis.telefon;
      }
 
      @Override
      publicvoid setTelefon(String telefon) {
            this.telefon = telefon;
      }
}
 
Ögrenci bir kisi oldugu için sadece IKisiBilgileri interface'inin kalitimini aldi ve bu interface içerisindeki methodlar 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 methodlar sinif içerisinde olusturuldu.
publicclass OgretimGorevlisi implements IKisiBilgileri, ICalisanBilgileri {
 
      private String adSoyad;
      private String ePosta;
      private String telefon;
      private String departman;
      private String gorev;
     
      @Override
      public String getDepartman() {
            returnthis.departman;
      }
 
      @Override
      publicvoid setDepartman(String departman) {
            this.departman = departman;
      }
 
      @Override
      public String getGorev() {
            returnthis.gorev;
      }
 
      @Override
      publicvoid setGorev(String gorev) {
            this.gorev = gorev;
      }
 
      @Override
      public String getAdSoyad() {
            returnthis.adSoyad;
      }
 
      @Override
      publicvoid setAdSoyad(String adSoyad) {
            this.adSoyad = adSoyad;
      }
 
      @Override
      public String getEPosta() {
            returnthis.ePosta;
      }
 
      @Override
      publicvoid setEPosta(String ePosta) {
            this.ePosta = ePosta;
      }
 
      @Override
      public String getTelefon() {
            returnthis.telefon;
      }
 
      @Override
      publicvoid setTelefon(String telefon) {
            this.telefon = telefon;
      }
}
 
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 methodlara 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 methodlara 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 methodları 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 methodları görebiliyoruz.
Son olarak ICalisanBilgileri türünde bir degisken tanimlayip bellekte OgretimGorevlisi türünde yer ayiralim:
 
Burada da sadece ICalisanBilgileri'nde tanimlanan methodlara ulasabildik.
 
 
 
 
 

Veysel Uğur KIZMAZ

Bilgisayar Mühendisi
veysel@ugurkizmaz.com
www.ugurkizmaz.com
twitter: @vukizmaz