Sunday, September 12, 2010

Abstract Class

             Normal bir sinif ile interface sinifinin birlesimi diye dusunurseniz o zaman abstract siniflari anlamak daha kolay olacak tabi boyle bir tanim abstract gibi guclu bir sinif yapisina haksizlik olacak ama yazinin ilerleyen kisimlarinda abstract siniflarin gucunden ve kullanimi sirasinda dikkat edilmesi gereken kurallardan bahsetmek icin bu yaziyi yazdim oncelikle bir abstrac ornegi ile basliyacam ve bu ornek uzerinde tum konuyu anlatmaya calisacam
           Benim uygulamam su sekilde Insan diye bir abstract sinifim var ve bu sinifta insanlarin ortak olan ve farkli olan tum niteliklerini olusturdugum bir sinif

    public abstract class Insan {

            public abstract int getBoy() ;

            public abstract String getGozRengi();

            public abstract int getKilo();

            public abstract int getYas();

           public void yemek(){
                  System.out.println("Tum Insanlar yemek yer");
           }

          public void sinirlenmek(){
                System.out.println("Tum Insanlar Sinirlenir yer");
          }

          public void gulmek(){
                System.out.println("Tum Insanlar Guler yer");
          }

   }

   public class Abdulkadir extends Insan{

         @Override
         public int getBoy() {
                 return 180;
          }

         @Override
         public String getGozRengi() {
               return "Ela";
          }

         @Override
          public int getKilo() {
                  return 73;
          }

         @Override
          public int getYas() {
               return 27;
          }

    }

    public class Ertugrul extends Insan{

            @Override
            public int getBoy() {
                    return 182;
           }

           @Override
           public String getGozRengi() {
                 return "Kahverengi";
           }

          @Override
          public int getKilo() {
                 return 70;
          }

        @Override
        public int getYas() {
               return 26;
        }

}


   public class TestMain {
            public static void main(String args[]){
                      Abdulkadir a = new Abdulkadir();
                      a.gulmek();
                      a.sinirlenmek();
                      a.yemek();
                      System.out.println("BOY : "+a.getBoy());
                     System.out.println("KILO : "+a.getKilo());
                     System.out.println("YAZ RENGI : "+a.getGozRengi());
         }
   }


 //CONSOLE OUTPUT (Ekranda gosterilen veriler)
Tum Insanlar Guler yer
Tum Insanlar Sinirlenir yer
Tum Insanlar yemek yer
BOY : 180
KILO : 73
YAZ RENGI : Ela


Yukaridaki uygulamayi inceledigimizde Insan Abstract sinifinin hem bir inteface gibi soyut siniflarinin var oldugunu hemde normal sinif gibi ici dolu methodlarinin oldugunu goruyoruz. ve biz bu insan Abstract sinifini yaparken su mantiktanda yararlandigimizada dikkat etmissinizdir kalitim konusundaki gibi insana ait olan ortak ozelikleri bir araya toplayarak her seferinde tekrar tekrar yazmak ve kalitimin gucunden yararlanmak gibi bir durumda dikkatinizi cekmistir ve ayrica icinde soyut methodlarda var yani ben diyorumki bu insan sinifini extends edecek sinifa sen su methodlarida kullanmalisin yani tipki interfacede oldugu gibi Simdi gelelim Abstract siniflarda dikkat edilmesi gereken hususlara
  • . Bir sınıf soyut olucaksa, abstract anahtar sözüğü ile tanımlanır.public abstract class Insan
  •   Abstract bir sınıftan herhangibir nesne örneği türetilemez. Insan i = new Insan()  seklinde bir nesne ornegi olusturamayiz.
  • Abstract bir sinif abstract metod tanımlamarını içermesidir. public abstract int getBoy() ; 
  •  Bu Abstract sınıftan türeyen sınıflarda abstract methodlar mutlaka ama mutlaka override edilmelidir. 
  • Abstract siniflar olustururken tek baslarina bir manalari yok anacak kalitim yolu ile kullanildigini soylemistik iste eyer bir yerde kalitim varsa o zaman polimorfizimden bahsetmek mumkun buda yine abstrac sinifini bir gucudur 
    public class TestMain {
            public static void main(String args[]){
                     Abdulkadir a = new Abdulkadir();
                     testPoli(a);
                     System.out.println("---------------------------------------------------");
                     Ertugrul e = new Ertugrul();
                     testPoli(e);
            }

            public static void testPoli(Insan i){
                        i.gulmek();
                        i.sinirlenmek();
                        i.yemek();
                        System.out.println("BOY : "+i.getBoy());
                        System.out.println("KILO : "+i.getKilo());
                        System.out.println("YAZ RENGI : "+i.getGozRengi());
           }
   }


//CONSOLE OUTPUT 
Tum Insanlar Guler yer
Tum Insanlar Sinirlenir yer
Tum Insanlar yemek yer
BOY : 180
KILO : 73
YAZ RENGI : Ela
---------------------------------------------------
Tum Insanlar Guler yer
Tum Insanlar Sinirlenir yer
Tum Insanlar yemek yer
BOY : 182
KILO : 70
YAZ RENGI : Kahverengi
 

  •  Abstract sınıf tanımlamalarında dikkat çeken bir diğer unsurda, bu sınıfın abstract metodlar dışındada normal sınıfların sahip olduğu üyelere sahip olabilmesidir. Normal metodlar veya alanlar. Normal bir metodu türeyen sınıflara ait nesneler üzerinden kalıtımın bir gereği olarak çağırabiliriz.
  •  Kalıtımın doğası gereği ilk olarak abstract sınıf içerisindeki yapıcı metodu işleyeceğinide biliyoruz burada sunu demek istiyorum 
Insan ve Abdulkadir siniflarina su yapilandiricilari ekledim
public Insan() {
       System.out.println("Ben Insan sinifin Yapicisiyim");
}



public Abdulkadir() {
System.out.println("Ben Abdulkadir sinifinin Yapilandiricisiyim.....");
}


Simdi bu dedigimiz olayin nasil calistigina bakalim
   public class TestMain {
          public static void main(String args[]){
                Abdulkadir a = new Abdulkadir();
                System.out.println("KILO : "+a.getKilo());
         }
   }


//CONSOLE OUTPUT 
Ben Insan sinifin Yapicisiyim
Ben Abdulkadir sinifinin Yapilandiricisiyim.....
KILO : 73


  • Abstract sınıftan başka abstract sınıflar türetilmesi sirasinda dikkat edilecek hususlar
   public abstract class Canlilar {
            public Canlilar() {
                  System.out.println("Canlilar sinifinin Yapilandiricisi......");
             }

           public abstract void yasamak();


           public abstract void olmek();

            public void test(){
                 System.out.println("Canlilar sinifinin test methodu");
            }

    }



   public abstract class Insan extends Canlilar{

              public Insan() {
                       System.out.println("Ben Insan sinifin Yapicisiyim");
               }

               public abstract int getBoy() ;

               public abstract String getGozRengi();

                public abstract int getKilo();

                public abstract int getYas();

                public void yemek(){
                       System.out.println("Tum Insanlar yemek yer");
               }

              public void sinirlenmek(){
                     System.out.println("Tum Insanlar Sinirlenir yer");
              }

              public void gulmek(){
                        System.out.println("Tum Insanlar Guler yer");
                 }

     }

Gorulduyu gibi bir abstract sinifi baska bir abstract siniftan turetmek icin oncelikle extends kelimesinden yaralalndik yani ayni normal siniflarda oldugu gibi. Normal bir sinifa abstract sinifi extends ettigimizde abstract methodlari override etmek gerekliydi ama yukardaki uygulamada gorulduyu gibi bu sekilde bir sey soz konusu degil.
Eyer biz Insan abstract sinifini Abdulkadir sinifina extends edersek o zaman hem Canlilar'daki hemde Insan'daki abstract methodlari override etmemiz gerekir
  • Simdide bir Interface sinifini Abstract sinifina implements sirasinda nelerin olduguna bakalim:
   public interface CanlilarIn {
           void yasamak();
           void olmek();
  }


  public abstract class Insan implements CanlilarIn{

             public Insan() {
                      System.out.println("Ben Insan sinifin Yapicisiyim");
              }

              public abstract int getBoy() ;

              public abstract String getGozRengi();

              public abstract int getKilo();

              public abstract int getYas();

               public void yemek(){
                        System.out.println("Tum Insanlar yemek yer");
                }

               public void sinirlenmek(){
                          System.out.println("Tum Insanlar Sinirlenir yer");
               }

              public void gulmek(){
                       System.out.println("Tum Insanlar Guler yer");
              }
    }


       public class Abdulkadir extends Insan{

                   public Abdulkadir() {
                             System.out.println("Ben Abdulkadir sinifinin Yapilandiricisiyim.....");
                    }

                  @Override
                  public int getBoy() {
                          return 180;
                   }

                 @Override
                 public String getGozRengi() {
                           return "Ela";
                 }

                @Override
                 public int getKilo() {
                          return 73;
                 }

                @Override
                public int getYas() {
                        return 27;
                }

               public void yasamak() {
                           throw new UnsupportedOperationException("Not supported yet.");
               }

               public void olmek() {
                            throw new UnsupportedOperationException("Not supported yet.");
                 }

     }

 Gorulduyu gibi Insan  abstract sinifa CanlilarIn inteface sinifi implements olunca methodlarini Override edilmiyor ama Abdulkadir sinifina Insan abstract sinifi extends olununca CanlilarIn ile Insan sinifindaki soyut methodlar Override olunuyor






 

 

 



 


 

No comments:

Post a Comment