"Java programlama dili çoklu kalıtıma izin vermez. Ancak benzer modelleme kavramını ‘uygular’ kullanımı ile gerçekleştirir. Java, bir tek sınıftan kalıtıma ve aynı zamanda da bir çok ‘arayüz’den kısıtlanmış bir kalıtıma izin verir. Bu kısıtlanmış kalıtım, yalnızca işlevler içindir ve özellikleri kapsamaz. Java değimi ile tek kalıtım fakat çok uygulama yapma olanağı vardır." Bu cümlede ne demek istemiştir?

soruldu: 31 Ara '14, 17:22

fatihacar's gravatar image

fatihacar
241121426
cevap kabul oranı: 10%

değiştirildi: 31 Ara '14, 21:57

emrecan-oztas's gravatar image

emrecan-oztas
4.1k62146


Java çoklu kalıtıma izin vermemektedir. Yani bir sınıf birden fazla sınıftan miras alamaz. Eğer birden fazla sınıftan miras almak isteniyorsa bir kalıtım hiyerarşisi oluşturulmalıdır. Aşağıdaki örnekte çemberin alanını ve çevresini hesaplamak için bir kalıtım hiyerarşisi oluşturdum.

package com.emrecanoztas.btsoru;

/**
* @author EOZTAS
*
*/
class Cember {

    public int r = 0;
    public double sonuc = 0.0d;

}

class CemberAlan extends Cember {

     public void cemberAlanHesapla(int r) {
         this.r = r;

         sonuc = (Math.PI) * Math.pow(r, 2);
         System.out.println("Cember Alan: " + sonuc);
     }

     public void mesajVer(){
         System.out.println("Burası Super Class!");
     }
}

class CemberCevre extends CemberAlan {

      public void cemberCevreHesapla(int r) {
          this.r = r;

          sonuc = 2 * (Math.PI) * r;
          System.out.println("Cevre: " + sonuc);
      }

      public void mesajVer(){
          System.out.println("Burası Sub Class!");
      }

}

Cember sınıfı bizim super class'ımız, değişkenleri burda public olarak diğer sınıflarda kullanılması için tanımladım. CemberAlan sınıfı; cember sınıfının sub class'ı, CemberCevre sınıfının super class'ı oldu. CemberAlan ve CemberCevre sınıflarında iki tane metot oluşturduk. Birincisi metotta işlem yapılıyor, ikincisinde hangi sınıfa ait metot olduğunu yazdırıyoruz. Burda bir hiyerarşi oluşturarak waterfall (şelale) gibi tüm özellikleri alt sınıflara yüklemiş olduk. CemberAlan sınıfındaki mesajVer metodumuzu cemberCevre sınıfında override (metot ezme) yaptık. Bu yöntemle metotları yeni görevler yükleyebiliriz yani 'uygular' yöntemi. CemberCevre sınıfından bir Obje oluşturarak bu hiyerarşiyi tam olarak kullanabiliriz.

Bir sınıf birden fazla sınıftan miras alamaz, o zamanda devreye Interface (Arayüz) kavramı giriyor. Interface'ler aslında metot prototiplerinin (sadece gövdeleri olmayan metotların yazıldığı) tanımlandığı bir yapıdır. Yukardaki örneği hem inheritance hemde interfaces yardımıyla yeniden yazalım.

package com.emrecanoztas.btsoru;

/**
* @author EOZTAS
*
*/
class Cember {

    public int r = 0;

    public double sonuc = 0.0d;

}

interface cemberAlan {

    public void cemberAlanHesapla(int r);
}

interface cemberCevre {

    public void cemberCevreHesapla(int r);

}

class Islem extends Cember implements cemberAlan, cemberCevre {

    public void cemberAlanHesapla(int r) {
            this.r = r;

            sonuc = (Math.PI) * Math.pow(r, 2);
            System.out.println("Cember Alan: " + sonuc);

    }

    public void cemberCevreHesapla(int r) {
            this.r = r;

            sonuc = 2 * (Math.PI) * r;
            System.out.println("Cevre: " + sonuc);

    }

}

Bu yazdığımız örnektede; Cember adında bir sınıf oluşturduk ve kullanacağımız değişkenleri yazdık. 2 tane interface tanımlayıp kullanacağımız metotların sadece gövdelerini yazdık. Islem sınıfında; Cember sınıfını miras aldık, interface'leri uyguladık. Islem sınıfından Obje oluşturarak bu hiyerarşiyi kullanabiliriz. Hadd-i zatinde her iki örnekte aynı işi yapıyor.

Benim üstadlarımdan gördüğüm; inheritance uygulamalarından kaçınmaları. Çünkü inheritance ile kodun kırılganlığı artıyor ve refactoring (yeniden yapılandırma) zorlaşıyor. interface'ler yardımıyla yazılan kodun kalitesi ve yeniden yapılandırılması artıyor. Umarım örnekler yardımcı olmuştur. :)

permanent link

cevaplandı: 31 Ara '14, 21:53

emrecan-oztas's gravatar image

emrecan-oztas
4.1k62146
cevap kabul oranı: 24%

Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×1,076
×1

Soruldu: 31 Ara '14, 17:22

Görüntüleme: 622 kez

Son güncelleme: 31 Ara '14, 21:57

powered by BitNami OSQA