# Soyut Sınıf (Abstract Class) "abstract" anahtar kelimesi ile tanımlanan sınıflardır. Sınıfın içinde soyut ("abstract") metotlar veya normal fonksiyonlar tanımlanabilir. Soyut sınıflardan "new" anahtar kelimesi ile bir nesne oluÅturulamaz. **Soyut Sınıf Ãzellikleri:** - "abstract" anahtar kelimesi ile tanımlanmıŠolması gerekiyor. - Soyut veya soyut olmayan fonksiyonlar tanımlanabilir. - Soyut sınıflardan "new" anahtar kelimesi ile nesne oluÅturulamaz. - Kurucu metodu ve static fonksiyonlar tanımlanabilir. - "final" kelimesi ile tanımlanmıŠfonksiyonları içerebilir. Bu final fonksiyonlar alt sınıflarda ezilemezler (override). ```java // abstract sınıf örneÄi public abstract class Doping { protected double price; protected double[] taxes; public double[] getTaxes() { return taxes; } public void setTaxes(double[] taxes) { this.taxes = taxes; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } // soyut metot örneÄi public abstract double calculate(); } ``` Yukarıda soyut bir sınıf tanımladık. "abstract" kelimesi ile sınıf tanımladık, ayrıca sınıfın içinde "calculate" isimli "abstract" metot tanımladık. Aynı zamanda soyut olmayan metotlar da tanımladık. Senaryomuzda bir e-ticaret sisteminde "Doping" tipinde ek ürünler olduÄunu düÅünelim. İlan tarihini güncelleyen bir doping çeÅidimiz olsun, bir de üst sırada çıkmanızı saÄlayan bir doping olsun. Bu iki alt sınıfta "Doping" isimli sınıftan kalıtım alarak belli özellikleri kendilerine alsınlar. Fakat, her dopingin ücret hesaplama yöntemi birbirinden farklı olabilir. Ayrıca, her dopingin mutlaka fiyat hesaplama fonksiyonu olmalıdır. Yukarıdaki durumda "abstract" sınıf tanımlayıp diÄer doping çeÅitleri bu ATA sınıftan kalıtım alacaklardır. "calculate" isimli "abstract" metodu, "metod ezme" (overriding) yöntemiyle ezip metodun içini kendilerine göre dolduracaklardır. Alt sınıflardaki diÄer özellikler soyutlama tekniÄiyle dıŠdünyadan gizlenecektir. DıŠdünyadan dopingi kullanmak isteyen baka bir sınıf veya kod parçası doping nesnesi üzerindeki "calcualte" fonksiyonunu çaÄırıp fiyatı hesaplacaktır. DiÄer iç hesaplama ve çalıÅma detaylarını bilmeyecektir. ```java public class TopOfListDoping extends Doping { public TopOfListDoping(double price) { super.setPrice(price); } // "Doping" soyut sınıfından kalıtımla gelen, "calculate" isimli soyut metodu metot ezmesi yöntemiyle alt sınıf kendi ihtiyacına göre dolduruyor. // "TopOfList" isimli doping tipinde vergiler olmadıÄı için komisyon oranı eklenip ücret hesaplanıyor. Fakat, baÅka doping çeÅitlerinde hesaplama farklı olabilir. @Override public double calculate() { return super.getPrice() + super.getPrice() * 0.35; } } public class UptodateDoping extends Doping { public UptodateDoping(double price, double[] taxes) { super.setPrice(price); super.setTaxes(taxes); } // "Doping" soyut sınıfından kalıtımla gelen, "calculate" isimli soyut metodu metot ezmesi yöntemiyle alt sınıf kendi ihtiyacına göre dolduruyor. // "UptodateDoping" isimli doping tipinde vergiler fiyata dahil olduÄu için komisyon oranı eklenip ve vergiler hesaplanıp ücret belirleniyor. // GörüldüÄü gibi her doping çeÅidinin fiyat hesaplama yöntemleri birbirinden farklıdır. Soyutlama ile sınıflara ait iç çalıÅma detayları gizlenmmiÅ oluyor. // Doping tiplerinde sadece "calculate" isimli fonksiyonu dıŠdünyaya açtık. DiÄer tüm fonksiyonlar ve özellikler sınıf içinde kaldı. @Override public double calculate() { return calculateTaxes() + commisionRate(); } private double calculateTaxes() { double totalTaxValue = 0; for(int i=0; i < super.getTaxes().length; i++) { totalTaxValue += super.getTaxes()[i]; } return totalTaxValue; } private double commisionRate() { return super.getPrice() * 0.2; } } ``` "Doping" soyut sınıfından kalıtımla gelen, "calculate" isimli soyut metodu metot ezmesi yöntemiyle alt sınıf kendi ihtiyacına göre dolduruyor. "TopOfList" isimli doping tipinde vergiler olmadıÄı için komisyon oranı eklenip ücret hesaplanıyor. Fakat, baÅka doping çeÅitlerinde hesaplama farklı olabilir. "Doping" soyut sınıfından kalıtımla gelen, "calculate" isimli soyut metodu metot ezmesi yöntemiyle alt sınıf kendi ihtiyacına göre dolduruyor. "UptodateDoping" isimli doping tipinde vergiler fiayta dahil olduÄu için komisyon oranı eklenip ve vergiler hesaplanıp ücret belirleniyor. GörüldüÄü gibi her doping çeÅidinin fiyat hesaplama yöntemleri birbirinden farklıdır. Soyutlama ile sınıflara ait iç çalıÅma detayları gizlenmiÅ oluyor. Doping tiplerinde sadece "calculate" isimli fonksiyonu dıŠdünyaya açtık. DiÄer tüm fonksiyonlar ve özellikler sınıf içinde kaldı.