Java’da Abstract (Soyut) Sınıflar

1086
views

Bir önceki yazımızda interfacelerin ek özelliklerinden bahsetmiştik. Bu dersimizde ise abstract classlar konusunu öğreneceğiz.

Daha önceden inheritance ve interface kavramlarını görmüştük.

inheritance kullanarak ne yapıyorduk?

Bir üst sınıftan alt sınıflar türetebiliyorduk. Ve bu üst sınıfın tüm özelliklerini ve metotlarını kullanabiliyorduk. Yani direk bunları miras olarak alabiliyorduk. İsteğimize göre bu metotları override edebiliyorduk veya etmiyorduk.

Peki interface kullanarak ne yapıyorduk?

Biz interfacelere soyut yani kod bloğu olmayan metotlarımızı yazıyorduk. Ve bu interface e implement eden her class bu metotları kendi göre yazıyordu.

Peki biz override edilmesi gerekmeyen metotları ve mutlaka override edilmesi gereken metotları bir classta biriktirip daha sonra  bu classtan alt sınıflar türetmek istersek hangi yapıları kullanacağız?

İşte burada karşımıza abstract (soyut) classlar karşımıza çıkıyor. Abstract classların bu yapısı aslında inheritance ile interface arası bir yapı gibi düşünülebilir.

Abstract Classların Özellikleri

  • Abstract classlardan intercafeler gibi objeler oluşturamıyoruz. Ancak abstract classların referansları alt sınıflara direk olarak referans olabiliyor.
  • Abstract classlar hem gövdeli hem de gövdesiz metotlar bir arada bulunuyor. Yani hem somut hem de soyut metotlarımız bir arada bulunuyor.
  • Abstract classlara özellikler eklenebiliyor.
  • Bir classın abstract class olması demek en az 1 tane abstract metotunun yani bir tane gövdesiz metodu bulunduğu anlamına geliyor.
  • Abstract classlarla oluşturulan bir tasarımda bir metotun alt sınıflarda mutlaka yazılması gerekiyorsa bu metodun bu sınıflara özgü olması için bu metodun abstract olarak tanımlanması bizim için çok daha doğru olacaktır.

Ancak override edilmesine gerek kalamayan mesela getter ve setter metotları veya başka ortak fonksiyonlar ,ortak metotlar gibi override edilmeye gerek kalmayan metotlarıda biz abstract classlarda abstract olarak yazmıyoruz ve direk orda metodumuzu tanımlıyoruz. Bu sayede kod tekrarına düşmemiş oluyoruz.

Şimdi örnek üzerinden anlamaya çalışalım;

Bir classın abstract olabilmesi için abstract anahtar kelimesine ihtiyacı var.

Classımızı abstract class olacak şekilde oluşturduk. Bu classımızın içinde override edilmesine gerek kalmayan metotlarımız ve abstract metotlarımız bir anda bulunuyor. Şimdi ilk olarak abstract classa bir tane özellik ekleyeceğiz.

Özelliğimizi ekledik. Constructorımızı oluşturduk Ve bir tane metot yazdık. Bir tane de soyut metot yazmamız gerekiyor. Soyut metot ne anlama geliyor? Soyut metodu buraya yazacağız ve bu abstract classtan türettiğimiz alt sınıflar bunu kendine göre yazmak zorunda kalacak.

Sekil classından alt sınıflar türeteceğiz. Ve daha sonra abstract classların ne anlama geldiğini biraz daha iyi anlamaya çalışacağız.

Şimdi 2 tane class oluşturuyoruz.

Kare ve Daire isminde. Sekil classı içerisinde bir tane abstract metot yazmıştık alan_hesapla() adında. Biz bu metodu Sekil classı içinde normal bir metot olarak veya diğer classlar içinde metot olarak tanımlayamaz mıydık? Abstract metot olarak tanımlamamızın mantığı neydi?

alan_hesapla() metodu Kare classında ve Daire classında farklı bir şekilde yazılması gerekiyor. Çünkü her ikisininde alan hesaplaması farklı. Bu yüzden abstract metot olarak yazdık.

Kare classında bu abstract metodu kullanabilmemiz için inheritance yapmamız gerekir. Yani Sekil classından extends yapmalıyız.

Yukarıdaki gibi Sekil classından extends yapmaya çalıştığımızda bize hata veriyor. Eğer biz Sekil sınıfından türettiysek bu Kare sınıfını abstract metodunu implement etmen gerekiyor uyarı verdi.

Bunun için;

Abstract metodumuzu eklememize rağmen hala hata veriyor. Bu seferde

Kendi constructorını kendin yaz şeklinde hata verdi.

constructorımızı yazdıktan sonra hata düzeldi.

Kare classımıza ek olarak bir tane daha özellik eklememiz gerekiyor. kenar adında bir özellik ekliyoruz.

kenar özelliğimizi ekledik ve constructor metodumuzada ek olarak yazdık.

Şimdi metodumuzun içini dolduralım.

Şimdi aynı işlemleri Daire classı için yapalım.

Şimdi bu metotları main classımız içinde kullanmaya çalışalım.

Abstract metotları bu şekilde kullanabiliyoruz. Veya şu şekilde de kullanabilirdik.

Şimdi Kare classına cevre_hesapla() adında bir metot daha yazalım ve ardından main classı içerisinde bu metodu çağıralım.

Main classına gelip cevre_hesapla() metodumuzu çağırıyoruz.

Kare nin çevresi 32 olarak karşımıza çıktı. Ancak biz cevre_hesapla() metodunu sekil referansı üzerinden çağırmaya çalıştığımızda bakalım ne olacak?

Method cevre_hesapla() bulunamıyor şeklinde hata verdi. Çünkü sekil abstract bir class ve Kare classının içindeki ekstra metodu göremiyor. Abstract classlarımızın mantığı bu şekilde. Eğer alt sınıflar bu metodu yazmak istiyorsa abstract class içerisinde gövdesiz bir şekilde abstract metodumuzu yazıyoruz sonrasında alt classlarda bu metodun içini doldurarak yazıyoruz.

Bir sonraki yazımızda static anahtar kelimesini göreceğiz. Sonraki derse geçmek için tıklayınız.

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz