Modül dersleri (1/2)
Arayüzler
Soyut sınıflar hem kısmen uygulanmış kodu hem de örnek alanlarını içerebilirken, Java'daki arayüzler saf davranış sözleşmeleridir. Bir arayüz, bir sınıfın ne yapması gerektiğini tanımlar ancak bunu nasıl yapacağını tanımlamaz.
Bu, operasyonların tanımı ile gerçek uygulamaları arasında tam bir ayrım yapılmasına olanak tanır.
Arayüz Tanımlama (interface)
interface anahtar kelimesini kullanıyoruz. Bir arayüzde bildirilen tüm yöntemler örtülü olarak public ve abstract şeklindedir (bunu belirtmeye gerek yoktur):
interface Drivable {
void startEngine();
void stopEngine();
}Bir Arayüzü Uygulamak (implements)
Bir sınıf, implements anahtar sözcüğünü kullanarak bir arayüz uygular ve tanımlanan tüm yöntemler için uygulamayı (bir gövdeyle birlikte) sağlaması gerekir:
class Motorcycle implements Drivable {
@Override
public void startEngine() {
System.out.println("Rombo del motore acceso!");
}
@Override
public void stopEngine() {
System.out.println("Motore spento.");
}
}Arayüzlerin Avantajları
- Çoklu Kalıtım: Java'da, bir sınıf yalnızca bir ebeveyn sınıfını genişletebilir (tekli miras), ancak aynı anda birden fazla arayüzü uygulayabilir.
Java
class HybridCar implements Drivable, Chargeable { ... } - Dekuplaj: Değişkenleri arayüz tipini kullanarak tanımlayabilirsiniz. Bu arayüzü uygulayan herhangi bir nesne, böyle bir değişkene atanabilir.
Java
Drivable vehicle = new Motorcycle(); vehicle.startEngine();
Arayüzlerdeki Sabitler
Arayüzlerde alanları bildirmek mümkündür. Bu değiştiricileri belirtmeseniz bile, bu alanlar örtülü olarak public static final (sınıf sabitleri anlamına gelir) şeklindedir. Sonuç olarak, bildirimden hemen sonra başlatılmaları gerekir:
interface PhysicsConstants {
double GRAVITY = 9.81; // Implicitly public static final
}Varsayılan Yöntemler (default)
Java 8'den başlayarak, default anahtar sözcüğünü kullanarak bir arayüz içinde varsayılan uygulamaya sahip yöntemleri tanımlamak mümkündür. Bu yöntemler, uygulayıcı sınıfları bunları geçersiz kılmaya zorlamaz ve bir geri dönüş davranışı sağlar:
interface Logger {
void log(String message);
// Default method with a body
default void logError(String message) {
log("ERROR: " + message);
}
}Kendin dene
void fly() yöntemiyle Flyable bir arayüz oluşturun. Daha sonra Flyable'ı uygulayan ve Flying'i ekrana yazdıran bir Bird sınıfı uygulayın.
İpucu göster
Flyable'da "void fly();" yazın. Bird sınıfında, onu `@Override public void fly() { System.out.println('Flying'); ile işaretleyen yöntemi uygulayın. }`.
3 denemeden sonra çözüm mevcut
Void Draw() yöntemiyle Drawable bir arayüz tanımlayın. Daha sonra Drawable'ı uygulayan ve Çizim Dikdörtgeni'ni yazdıran bir Rectangle sınıfı uygulayın.
İpucu göster
Arayüzde `void Draw();` tanımını yapın. Dikdörtgen'de, `@Override public void çizimini kullanın() { System.out.println('Drawing Rectangle'); }`.
3 denemeden sonra çözüm mevcut
Void swim() yöntemini tanımlayarak Swimmable arayüzünü tamamlayın. Ardından, hem Flyable hem de Swimmable'ı uygulayacak şekilde Duck sınıfını tamamlayın; Flying in the fly() yöntemini ve Yüzme in the swim() yöntemini yazdırın.
İpucu göster
Swimmable'ın içinde `void swim();' değerini bildirin. 'Class Duck, Flyable, Swimmable'ı uygular'ı bildirin ve istenen dizeleri yazdırırken her iki yöntemi de uygulayın.
3 denemeden sonra çözüm mevcut