# Arayüzler (Interface) Java'da soyutlamayı saÄlamanın bir baÅka yolu "interface" tanımlamaktır. "interface" 'ler abstract sınıflara göre soyutlama oranı çok yüksektir. Ãünkü, "interface" içinde sadece soyut fonksiyonlar tanımlayabilirsiniz. Metot gövdesi olan normal fonksiyonlar tanımlayamazsınız. "interface"ler sözleÅmeler gibidir. Bir sınıf eÄer bir interface'den kalıtım alıyorsa o "interface"de tanımlı olan tüm soyut özellikleri karÅılamak zorundadır. EÄer, kalıtım alan sınıf "interface"deki bazı metotlara ihtiyaç duymuyorsa yazılım tasarımınızda bir problem var demektir. Bu noktada "Interface Segregation" yapmanızı öneririm. "Interface Segregation" ile interface'ler alt interface tanımlarına bölünebilir. Neden "interface" kullanırız? - En önemli sebebi soyutlama ve çok biçimliliÄi saÄlamak için - "interface" ile çoklu kalıtımı saÄlayabiliriz. Bir sınıf birden fazla interface'den kalıtım alabilir. Ayrıca, interface'ler de birbirinden kalıtım alabilir. - GevÅek baÄlı yazılım modülleri kurmak için gereklidir. Bir sınıf "interface"den kalıtım alıyorsa "implements" anahtar kelimesi kullanılır. Ãrnek bir tanımlamaya göz atalım. ```java // interface anahtar kelimesi ile bir interface tipi tanımlanır. public interface PaymentProvider { // interface içinde yer alan fonksiyonların hepsi soyuttur. // Bu soyut fonksiyonlar interface'den kalıtım alan alt sınıflarda doldurulur. public boolean cancelCharge(int chargeId); public int charge(double totalPrice); public String loadInvoice(int chargeId); } ``` Alt sınıflar interface'den kalıtım alırlar. ```java public class AssecoPaymentSystem implements PaymentProvider { @Override public boolean cancelCharge(int chargeId) { // TODO Auto-generated method stub return false; } @Override public int charge(double totalPrice) { // TODO Auto-generated method stub return 0; } @Override public String loadInvoice(int chargeId) { // TODO Auto-generated method stub return null; } } public class IyzicoPaymentSystem implements PaymentProvider { @Override public boolean cancelCharge(int chargeId) { // TODO Auto-generated method stub return false; } @Override public int charge(double totalPrice) { // TODO Auto-generated method stub return 0; } @Override public String loadInvoice(int chargeId) { // TODO Auto-generated method stub return null; } } ``` ## Nesneye Dayalı Programlamada "IS-A" İliÅkisi Sınıflar arasında kalıtım (Inheritance) yoluyla kurulan iliÅkiler "IS-A" iliÅki biçimidir. "IS-A" kalıbı İngilizce'den türemiÅtir. Aslında, bu nesne arabadır, bu nesne faturadır, bu nesne insandır demenin bir baÅka biçimidir. Kalıtım konusunda da iÅledik, kalıtım yoluyla aslında bir aileye üye olursunuz. Nasıl ki gerçek hayatta genetik olarak ebeveynlerinizden miras alıyorsanız, aynı Åekilde yazılımda da bir sınıf baÅka sınıftan kalıtım alıyorsa o ailenin bir alt türü olmuÅ oluyor. Mesela, Tax tipinde bir ATA sınıf oluÅturmuÅtuk. Bu sınıftan kalıtım alan KDVTax, OTVTax tipinde alt sınıflar da oluÅturduk. Bu alt sınıflara "Bu nesne nedir?" sorusunu sorduÄumuzda "Tax" sınıfının bir alt türüdür diyebiliyoruz. Yani bu nesne KDV vergisidir. Bu nesne OTV vergisidir diyebiliyoruz. Yani İngilizce'ye dökecek olursak "KDVTax class is a Tax", "OTVTax class is a Tax" prensibine uyuyor. Genellikle, ebeveyn-çocuk iliÅkisi olan durumlar "IS-A" iliÅkisine örnektir. Zaten, Kalıtım yoluyla sınıflar arasında ebeveyn-çocuk iliÅkisi kurduÄumuzdan Kalıtım yoluyla kurulan iliÅkilerde "IS-A" iliÅkisi vardır diyebiliriz. ## Nesneye Dayalı Programlamada "HAS-A" İliÅkisi İngilizce terim olarak "Aggregation" olarak adlandırılır. Kelime anlamı olarak "bir araya getirme" olarak adlandırılır. Sınıf içinde baÅka bir sınıfın nesne referansını tutuyorsak bu "HAS-A" iliÅki biçimidir. "HAS-A" ifade de "sınıfımız bu nesneye sahip midir?" sorusundan ortaya çıkıyor. HAS-A iliÅkilerde bir aile üyesi olmanıza gerek yoktur. Bunu Computer sınıfı örneÄimiz üzerinden açıklayalım. ```java public class Computer { // Screen ve Keyboard tipinden bir nesneleri referans olarak tutuyoruz. // "keyboard" ve "screen" isimli nesneler "HAS-A" iliÅkisine örnektir. // "Inheritance" yoluyla deÄil de "Aggregation" yoluyla sınıf içinde tanımlanmıÅtır. /* * Keyboard ve Screen niçin Computer sınıfına kalıtım vermemiÅtir diye sorabilirsiniz. * Ãünkü, Keyboard ve Screen veri tipi, Computer veri tipiyle bir akrabalık iliÅkisi yoktur. * Computer baÅka bir nesnedir. Keyboard baÅka bir nesnedir. Akrabalık baÄı bulunmadıÄı için bu sınıflardan nesneleri "Aggregation" yoluyla * Computer sınıfı içinde kullandık. * * Fakat, Computer sınıfından kalıtım almıŠLaptop ve Desktop alt sınıfları kalıtım oluyla iliÅki kurarlar. * Ãünkü, Desktop ve Laptop, Computer nesnesinin bir alt türüdür. Bir akrabalık iliÅkisi vardır. * Aynı ailenin üyesidirler. Computer sınıfı ile Desktop ve Laptop sınıfları arasındaki iliÅki "IS-A" iliÅkisidir. * */ protected Keyboard keyboard; protected Screen screen; protected Computer(Screen screen, Keyboard keyboard) { this.screen = screen; this.keyboard = keyboard; } public void showOnScreen(String message) { this.screen.show(message); } public String readFromKeyboard() { return this.keyboard.readFromKeyboard(); } } ``` "Screen" ve "Keyboard" tipinden bir nesneleri referans olarak tutuyoruz. "keyboard" ve "screen" isimli nesneler "HAS-A" iliÅkisine örnektir. "Inheritance" yoluyla deÄil de "Aggregation" yoluyla sınıf içinde tanımlanmıÅtır. "Keyboard" ve "Screen" sınıfları ile "Computer" sınıfı arasında neden kalıtım yoluyla bir iliÅki kurmuyoruz diye sorabilirsiniz. Ãünkü, "Keyboard" ve "Screen" veri tipi, "Computer" veri tipiyle bir akrabalık iliÅkisi yoktur. "Computer" baÅka bir nesnedir. Keyboard baÅka bir nesnedir. Akrabalık baÄı bulunmadıÄı için bu sınıflardan nesneleri "Aggregation" yoluyla "Computer" sınıfı içinde kullandık. ```java public class Desktop extends Computer { public Desktop(Screen screen, Keyboard keyboard) { super(screen, keyboard); } } public class Laptop extends Computer { public Laptop(Screen screen, Keyboard keyboard) { super(screen, keyboard); } } ``` Fakat, "Computer" sınıfından kalıtım almıŠ"Laptop" ve "Desktop" alt sınıfları kalıtım yoluyla iliÅki kurarlar. Ãünkü, "Desktop" ve "Laptop", "Computer" nesnesinin bir alt türüdür. Bir akrabalık iliÅkisi vardır. Aynı ailenin üyesidirler. "Computer" sınıfı ile "Desktop" ve "Laptop" sınıfları arasındaki iliÅki "IS-A" iliÅkisidir.