20. Arayüzler
Arayüz bir sınıf değildir. Arayüz yazmak sınf yazmaya çok benzer ancak ikisi birbirinden farklı konseptlerdir. Sınıf bir nesnenin özelliklerini ve davranışlarını belirtirken; bir arayüz sınıfların barındırdığı davranışları içerir.
Arayüz soyut metotların oluşturduğu bir koleksyondur. Bir sınıf arayüzü çalıştırırken arayüzün sahip olduğu soyut metotları da miras alır.
Bütün arayüz metotları sınıflarda tanımlanmalıdır.
Arayüzler sınıflarla şu şekilde benzerlik gösterir:
- Arayüz sınırsız sayıda metot içerebilir.
- Arayüzler .java uzantılı dosyalara yazılır ve dosya ile arayüz ismi aynı olmalıdır..
- Arayüzün bitkodları .class dosyasının içinde yer alır.
- Arayüzler paketler halinde bulunur.
Ancak bir arayüz bir sınıftan şu yönleriyle ayrılmaktadır.
- Arayüzün instance’ı alınamaz
- Arayüz constructor metot barındırmaz.
- Arayüzün içindeki bütün metotlar soyuttur.
- Arayüzler instance alanları bulunduramazlar. Tek bulundurabilecekleri alanlar da hem static hem de final olarak tanımlanmalıdır.
- Arayüzler sınıflara genişletilemez, sınıflara uygulanırlar.
- Bir arayüz başka arayüzlerle genişletilebilir
20.1 Arayüzlerin Tanımlanması
Arayüz oluşturmak için interface kelimesi kullanılır. Aşağıdaki örnekte bir tanımlama bulunmaktadır
Örnek:
Kapsüllemeyi anlatan örneği inceleyelim.
–Arayüzler aşağıdaki özelliklere sahiptir
- Arayüzler kendiliğinden soyuttur. Tanımlama yaparken abstract kelimesini kullanmaya gerek yoktur.
- Arayüzün içindeki metotlar da soyut olduğundan abstract kelimesine gerek yoktur.
- Arayüzün içindeki bütün metotlar tam olarak publictir.
Örnek:
20.2 Arayüzlerin Uygulanması
Bir sınıfın arayüzü çalışıtmasını; arayüzün bütün davranışlarını yapmayı kabul ettiği bir kontratı imzalamak olarak düşünebilirsiniz.Eğer sınıf arayüzün bütün davranışlarını gerçekleştirmiyorsa, kendini soyut olarak tanımlamalıdır.
Bir sınıf arayüzü uygulamak için implements kelimesini kullanır. Implements kelimesi sınıf tanımlanmasında kullanılır ve devamında extends kısmı gelir.
Aşağıdaki sonuç oluşacaktır.
Bir arayüz yazarken uyulması gereken kurallar şunlardır.
- Bir sınıf birden fazla arayüz uygulayabilir.
- Bir sınıf sadece bir sınıfa genişletilebilir ancak bir çok arayüze
genişletilebilir
- Bir arayüz; sınıfların yaptığı gibi diğer arayüzlere genişletilebilir
Arayüzlerin Genişletilmesi
Bir arayüz; sınıfların yaptığı gibi diğer arayüzlere genişletilebilir. Extends keyword miraslandırmak için kullanılır. Kelimenin kullanıldığı arayüz ana arayüze doğru genişler.
Aşağıdaki Hockey ve Football arayüzleri Sports arayüzünden genişletilmiştir.
Hockey arayuzunde 4 adet metot vardir ancak iki tanesini Sports’dan miras
alir ,boylelikle Hockey’den genisletilen sinif butun 6 metodu da almis olur. Ayni sekilde Football arayuzunu alan bir sinif 3 metodu Football’dan ikisini de Sports arayuzunden alir.
20.4 Birden Cok Arayuzun Genisletilmesi
Java’da bir sinif sadece bir adet siniftan genisletilebilir. Coklu mirasa izin verilmez. Arayuzler siniflar degildir o yuzden birden fazla arayuze genisletilebilir.
extend kelimesi kullanildiktan sonra genisletilecek ana arayuzler virgullerle ayrilarak yazilir.
Örnegin Hockey hem Sports hem de Event arayuzlerinden genisletilseydi asagidaki gibi tanimlanacakti.
public interface
Hockey
extends
Sports, Event
20.5 Birden Cok Arayuzun Uygulamasi
Java’da bir sinif sadece bir adet siniftan genisletilebilir. Coklu mirasa izin verilmez Arayuzler siniflar degildir o yuzden birden fazla arayuzden genisletilebilir.
implements kelimesi kullanildiktan sonra, kullanilacak arayuzler virgulle ayrilarak yazilir.
Örnek olarak, eger fenerbahce sinifi hem Hockey hem de Football sinifini uygulasaydi; kod asagidaki gibi olmaliydi.
}
public class fenerbahce implements Football, Hockey{
public void setHomeTeam(String name) {
}
public void setVisitingTeam(String name){
public void homeTeamScored (int points) {
}
public void visiting TeamScored(int points){
}
public void endOfQuarter (int quarter){
public void homeGoalScored(){
public void visitingGoalScored(){
public void endOfPeriod(int period) {
}
public void overtimePeriod(int ot) {
}
}
21 Üstüne Yazmak (Overriding)
Bir önceki bölümde süper sınıflar ve alt sınıflardan bahsetmiştik. Eğer bir sınıf bir üst sınıftan bir metodu miras alıyorsa, o metodun üstüne yazmak mümkündür. Ancak metot final olarak tanımlanmamış olmalıdır. Üstüne yazmanın avantajı şudur. Alt sınıfa özel bir metodun davranışını belirlemek. Yanı alt sınıf; ana sınıftan aldığı bir metodu kendi gereksinimlerine göre değiştirebilir. Nesne yönelimli programlamanın koşullarında üstüne yazmak; var olan bir metodun işlevselliğini değiştirmektir.
Örnek:
Örneği inceleyelim:
21.1 Üstüne Yazma Kuralları (Overriding Rules)
* Argüman listesi değiştirilen metotla tamamen aynı olmalıdır.
* Geri dönüş tipi aynı olmalıdır.
*Erişim düzeyi değiştirilen metottan daha fazla olamaz. Örneğin süper sınıfın metodu public tanımlandıysa; alt sınıfta değiştirilecek metot public veya private olamaz.
* final olarak tanımlanan bir metot değiştirilemez.
* static olarak tanımlanan bir metot değiştirilemez
* Bir metot miras alınamıyorsa değiştirilemez
* Constructor metotlar değiştirilemez.
21.2 Super Kelimesinin Kullanılması
Değiştirilen bir metodun süper sınıf versiyonu çağırılıyorsa super kelimesi kullanılmalıdır.