Skip to main content

Java Nesneye Yönelik Programlama : Upcasting , Downcasting

Java  ile Nesneye Yönelik Programlama dersinde İstanbul Üniversitesi Bilgisayar Mühendisliği öğrencilerine  verilen haftalık ödevdir.  Ödevde  kurulması istenilen yapı şu şekildedir.

1-Üniversite Personeli Arayüzü :   Bu alan interface olacak ve Calis() isminde bir metoda sahip.

2-Akademik Personel,İdari Personel Sınıfları  : Bu iki kısım yukarudaki Üniversite personeli  arayüzünü kullanacaktır.

3- Akademik  Personel Sınıfından miras alınarak Öğretim Üyesi ve Öğretim Görevlisi sınıfları oluşturulacaktır. Öğretim Üyesi sınıfında Öğretim görevslisinden farklı olarak Ünvan alanı bulunur.

 

Ana programda   Akademisyen tipinden bir sınıf oluşturmamız  ve bu sınıfın içerisine 5 adet Öğretim üyesi , 5 adet Öğretim görevlisi  nesnesi koymamız istenmektedir.  Peki bu yapılabilir mi ?  Sorunun cevabı kısmen evet olmalıdır. Standart yöntenlerle  bu yapılabilir ama bir takım kayıplar olacaktır.

Söyle ele alalım. Akademisyen tipi, Ad,Soyad gibi bilgilerden olusmakta iken Öğretim Üyesi tipi Ad,Soyad,Ünvan bilgilerinden olusmaktadır.  Biz   ana programda eğer Akademisyen türünden bir dizi oluşturursak ve bunun içine öğretim Üyesi elemanı koymaya kalkarsak derleyici bize uyarı vermez ama  standart yöntemlerle bu elemanın Unvan alanına  ulaşamayız.  Bu durumda devreye yukarı çevrim ( Upcasting) ve aşağı çevirim (Downcsasting) devreye girer.  Bu program bu kavramları ele almak için güzel bir örnek teşkil etmektedir.

İlk olarak interface alanını oluşturarak başlayalim

 

 
package universite;
 
/**
 *
 * @author Aytac Cici 
 * Java Programlama Ödev 3 Calismasi
 */
public interface UniversitePersonel {
   public void calis();
 
}

Şimdi bu interface alanını kullanan sınıflarımızı yazalım. Bir sınıfın bir interface alanını kullanmasını istersek implements anahtar kelimesini kullanacağız. Şimdi bu interfaceyi kullanan sınıfları yazalım..

 
 
 
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package universite;
 
/**
 *
 * @author Aytac Cici 
 * Java Programlama Ödev 3 Calisması
 */
public class akademisyen implements UniversitePersonel  {
   private String Ad;
   private String Soyad;
   private String Bolum;
 
    public akademisyen(String Ad, String Soyad, String Bolum) {
        this.Ad = Ad;
        this.Soyad = Soyad;
        this.Bolum = Bolum;
    }
 
    public akademisyen() {
    }
 
 
 
    public String getAd() {
        return Ad;
    }
 
    public void setAd(String Ad) {
        this.Ad = Ad;
    }
 
    public String getBolum() {
        return Bolum;
    }
 
    public void setBolum(String Bolum) {
        this.Bolum = Bolum;
    }
 
    public String getSoyad() {
        return Soyad;
    }
 
    public void setSoyad(String Soyad) {
        this.Soyad = Soyad;
    }
    public void calis()  //  Calis fonksiyonu  UniversitePersonel interfacesini kullanan her sınıfta olmak zorundadır . 
    {
        System.out.println(getAd() + " " + getSoyad() + "  isimli  Akademisyen Calisiyor...!");
    }
 
   public void derseGir()
   {
               System.out.println(getAd() + " " + getSoyad() + "  isimli akademisyen derse girdi ");
 
   }
 
}
 
 
 
 
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package universite;
 
/**
 *
 * @author Aytac
 */
public class idariPersonel implements UniversitePersonel  {
   String Ad;
   String Soyad;
 
    public idariPersonel(String Ad, String Soyad) {
        this.Ad = Ad;
        this.Soyad = Soyad;
    }
 
    public idariPersonel() {
    }
 
    public String getAd() {
        return Ad;
    }
 
    public void setAd(String Ad) {
        this.Ad = Ad;
    }
 
    public String getSoyad() {
        return Soyad;
    }
 
    public void setSoyad(String Soyad) {
        this.Soyad = Soyad;
    }
 
 
   public void calis()//  Calis fonksiyonu  UniversitePersonel interfacesini kullanan her sınıfta olmak zorundadır . 
   {
       System.out.println(getAd() + " " + getSoyad() + "  isimli idari personel Calisiyor.");
   }
 
}

Şimdi bu akademisyen ve İdari personel sınıflarından miras alan öğretim üyesi , öğretim görevlisi , ve dekan sınıflarını oluşturalım..

 
 
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package universite;
 
/**
 *
 * @author Aytac
 */
public class ogretimGorevlisi extends akademisyen {
 
    public ogretimGorevlisi() {
    }
 
    public ogretimGorevlisi(String Ad, String Soyad, String Bolum) {
        super(Ad, Soyad, Bolum);
    }
 
 
    public void calis()
    {
           System.out.println(getAd() + " " + getSoyad() + "  isimli  Öğretim Görevlisi Calisiyor...!");
    }
 
   public void derseGir()
   {
        System.out.println(getAd() + " " + getSoyad() + "  isimli Öğretim Görevlisi Derse Girdi.!");
   }
 
}
 
 
 
 
 
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package universite;
 
/**
 *
 * @author Aytac
 */
public class ogretimUyesi extends akademisyen {
 
    private String Unvan;
 
    public ogretimUyesi(String Unvan, String Ad, String Soyad, String Bolum) {
        super(Ad, Soyad, Bolum);
        this.Unvan = Unvan;
    }
 
 
 
 
 
    public ogretimUyesi() {
    }
 
    public String getUnvan() {
        return Unvan;
    }
 
    public void setUnvan(String Unvan) {
        this.Unvan = Unvan;
    }
 
 
 
    public void derseGir()
    {
           System.out.println(getUnvan() + " "  + getAd() + " " + getSoyad() + "  isimli  Öğretim Üyesi Derse Girdi...!");
    }
 
     public void calis()
    {
            System.out.println(getUnvan() + " "  + getAd() + " " + getSoyad() + "  isimli  Öğretim Üyesi  Çalisiyor.!");
    }
 
 
}
 
 
 
 
 
 
public class dekan extends idariPersonel {
 
    public dekan() {
    }
 
    public dekan(String Ad, String Soyad) {
        super(Ad, Soyad);
    }
 
 
 
}

Dikkatinizi çeken Nokta Calis() fonksiyonun neredeyse her sınıfta tanımlanmıs olduğudur. Biz bu işleme override diyoruz. Override kavramına farklı bir yazıda ayrıntılı olarak deyinebiliriz . Şimdilik override kullandığımızı bilmek yeterlidir.

Şimdi ana programı yazalim.

 
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package universite;
 
import javax.swing.JOptionPane;
 
/**
 *
 * @author Aytac
 */
public class Universite {
 
    /**
     * @param args the command line arguments
     */ 
    public static void main(String[] args) {
       akademisyen[] akademiyenlerim=new akademisyen[10];
       int sayac=0;
       while(sayac<akademiyenlerim.length)
       {
        if(sayac % 2==0) 
             {
        akademiyenlerim[sayac]=new ogretimUyesi();
        ogretimUyesi ou=(ogretimUyesi)akademiyenlerim[sayac]; // Bu satıra dikkat !!!
        ou.setAd(JOptionPane.showInputDialog((sayac+1) +". Adı Giriniz:"));
        ou.setSoyad(JOptionPane.showInputDialog((sayac+1) + ". Soyadı Giriniz"));
        ou.setBolum(JOptionPane.showInputDialog((sayac+1) + ". Bölüm Giriniz"));
        ou.setUnvan(JOptionPane.showInputDialog((sayac+1) + ".Unvan Giriniz"));
        ou.calis();
        ou.derseGir();
            }
        else 
            {
       akademiyenlerim[sayac]=new ogretimGorevlisi();
        ogretimGorevlisi ou=(ogretimGorevlisi)akademiyenlerim[sayac];
        ou.setAd(JOptionPane.showInputDialog((sayac+1) +". Adı Giriniz:"));
        ou.setSoyad(JOptionPane.showInputDialog((sayac+1) + ". Soyadı Giriniz"));
        ou.setBolum(JOptionPane.showInputDialog((sayac+1) + ". Bölüm Giriniz"));
        ou.calis();
        ou.derseGir();
           }
            sayac++;
       }
   }
}

Yukarıda dikkkat edilmesi gereken nokta ; akademisyen[] akademiyenlerim=new akademisyen[10]; tanımından sonra mesala bu akademiyenlerim[0=new ogretimUyesi(); kımutu ile sıfırıncı elemana bir öğretim üyesi atadığımızı düşünelim. Akademisyenlerim — > Ad, Soyad tan olusurken içine koyduğum Öğretim Üyesi –> Ad , Soyad, Ünvan bilgilerinden olusur. Görüldüğü üzere burada Öğretim üyesi daha gelişmiş bir sınıftır. akademiyenlerim[0].setAd diyerek ad alanına erişebebiliriz, aynı şekilde soyad alanına da erişim sağlanabilir ama akademiyenlerim[0].setUnvan dediğimizde derleyici bize bir hata verecektir. Cünkü bu alana bu sekilde ulasmak mumkun değildir. Acıklamaya caliştiğimiz gibi Öğretim üyesi sınıfı akademisyene göre daha gelişmiş bir sınıf oldugundan ve biz bu sınıfı akademisyen dizisinin içine yerleştirdiğimizden bir takım özelliklerini kaybetmiştir.

Bu sorunu aşmak işin Upcasting dediğimiz olayı kullandık . Şu satırı dikkatlice inceleyelim.

akademiyenlerim[sayac]=new ogretimUyesi();
ogretimUyesi ou=(ogretimUyesi)akademiyenlerim[sayac];

Görüldüğü üzere o anki sayac değerine göre akademisyen dizisine bir öğretim üyesi atiyoruz. Bu sekilde bir atamayla o elemanın Unvan alanına erişemeyeceğimizi demin görmüştük. Bundan dolayı Ögretim üyesi tipinden yeni bir değişken atiyoruz ve ismi ou ve bu kısımda (ogretimUyesi)akademiyenlerim[sayac] diyerek akademisyen tipinden diziyi Öğretimüyesine Upcasting ediyoruz . Yani yukarı çevirim yapiyoruz. Artık ou.SetUnvan() diyerek Unvan değerine veri atayabilir yada Get metodu ile icindeki değeri alabiliriz.

Aslında bu Upcsting ve Downcasting olayına daha kolay bir örnekte bakmak gerektiğini düşünüyorum. Kalın sağlcakla.

Share and Enjoy

  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS

Aytaç Cici

İstanbul Üniversitesi Bilgisayar Mühendisliği mezunu bir Yazılım Geliştirici. Çeşitli zamanlarda Java, PHP, C# ve Delphi gibi diller kullanarak yazılım geliştirmiştir. Bir dönem SEO alanında da çalışmalar yapmıştır.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Email
Print