Veysel Uğur KIZMAZ

Java Abstraction

29.04.2012Okunma Sayısı: 4334Kategori: Java

 Basitçe, methodlarının bir kısmı içinde yazılmış, bir kısmı kalıtımını alan sınıfa bırakılmış olan sınıfa Abstract class diyoruz. Abstract classlar, birden fazla sınıfın ortak methodlarının bulunduğu, kalan methodlarının da standart olup classtan classa değişken içerikte olduğu noktalarda kullanılır.

Bu konuyu bir örnekle detaylandıralım.
Örneğimizde, eşkenar üçgen, kare ve eşkenar altıgenin çevre ve alan işlemlerini yapan 3 tane sınıfımız olsun. Normalde bu sınıfların içeriği aşağıdaki gibi olacaktır.
EskenarUcgen.java
publicc lass EskenarUcgen {
     
      private doublekenar;
     
      public EskenarUcgen(double kenar){
            this.kenar = kenar;
      }
     
      public double getCevre(){
            returnthis.kenar * 3;
      }
     
      public double getAlan(){
            return (Math.pow(this.kenar, 2) * Math.sqrt(3)) / 4;
      }
}
 
Kare.java
public class Kare {
      private doublekenar;
     
      public Kare(double kenar){
            this.kenar = kenar;
      }
     
      publicdouble getCevre(){
            returnthis.kenar * 4;
      }
     
      public double getAlan(){
            return Math.pow(this.kenar, 2);
      }
 
EskenarAltigen.java
public class EskenarAltigen {
      private doublekenar;
     
      public EskenarAltigen(double kenar){
            this.kenar = kenar;
      }
     
      public double getCevre(){
            returnthis.kenar * 6;
      }
     
      public double getAlan(){
            return (3 * Math.sqrt(3) * Math.pow(this.kenar, 2)) / 2;
      }
}
 
Şimdi soyutlama yöntemi ile bu işlemi ortak bir noktaya çekelim.
GeometriIslem isminde bir abstract sınıf oluşturalım. Bu sınıfın constructorında kenar sayısı ve kenar uzunluğu bilgileri alınsın. Çevre uzunluğu tüm classlarda kenar sayısı * kenar uzunluğu olduğu için bu işlemin methodunu yazabiliriz. Alanları birbirinden farklı olacağı için bu methodu abstract olarak tanımlıyoruz. Bu tanımlama, bize alan methodunun kalıtım alınan sınıfta kullanılmasını zorunlu hale getiriyor ve içi sınıfın özelliğine göre düzenlenebiliyor.
public abstract class GeometrikIslem {
     
      protected intkenarSayisi;
      protected doublekenarUzunluk;
     
      public GeometrikIslem(double kenarUzunluk, int kenarSayisi){
            this.kenarSayisi = kenarSayisi;
            this.kenarUzunluk = kenarUzunluk;
      }
     
      public double getCevre(){
            return this.kenarSayisi * this.kenarUzunluk;
      }
     
      publicabstractdouble getAlan();
}
 
Şimdi EskenarUcgen, Kare ve EskenarAltigen sınıflarını bu sınıftan extend edelim.
EskenarUcgen.java
public class EskenarUcgen extends GeometrikIslem{
     
      public EskenarUcgen(double kenarUzunluk){
            super(kenarUzunluk, 3);
      }
     
      public double getCevre(){
            return super.kenarUzunluk * 3;
      }
 
      @Override
      public double getAlan() {
            return (Math.pow(super.kenarUzunluk, 2) * Math.sqrt(3)) / 4;
      }
}
 
Kare.java
public class Kare extends GeometrikIslem{
     
      public Kare(double kenarUzunluk){
            super(kenarUzunluk, 4);
      }
     
      public double getCevre(){
            return super.kenarUzunluk * 4;
      }
 
      @Override
      public double getAlan() {
            return Math.pow(super.kenarUzunluk, 2);
      }
}
 
EskenarAltigen.java
public class EskenarAltigen extends GeometrikIslem {
     
      public EskenarAltigen(double kenarUzunluk){
            super(kenarUzunluk,6);
      }
     
      public double getCevre(){
            return super.kenarUzunluk * 6;
      }
 
      @Override
      public double getAlan() {
            return (3 * Math.sqrt(3) * Math.pow(super.kenarUzunluk, 2)) / 2;
      }
}
 
 
Veysel Ugur KIZMAZ
Bilgisayar Mühendisi
veysel@ugurkizmaz.com
www.ugurkizmaz.com
twitter: @vukizmaz