Arayüz (Interface) © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 1 Arayüz (Interface) • Arayüzler, soyut sınıfların bir üst modeli gibi düşünülebilir. • Arayüzler tamamen birleştirici bir rol oynamaları için tasarlanmışlardır. © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 2 Arayüz (Interface) • Arayüzlerin içerisindeki gövdesiz (soyut) yordamlar (methods) otomatik olarak public erişim belirleyicisine sahip olurlar. © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 3 © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 4 Örnek BuyukIsYeri.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 5 class Mudur implements Calisan { public void calis() { // iptal etti (override) System.out.println("Mudur Calisiyor"); } } © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 6 Arayüz(Interface) ve Soyut sınıflar(Abstract classes) interface Hayvan { public void avlan() ; } abstract class Kedi implements Hayvan { } Bu örnek derlenir mi ? © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 7 © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 8 Örnek Karisim2.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 9 Arayüz(Interface) ile çoklu kalıtım(Multiple inheritance) • Java Programlama dili çoklu kalıtımı (multiple inheritance) desteklemez. © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 10 © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 11 Örnek - Hatalı Spor.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 12 Sebep Sporcu s = new SportmenMehmet(); // yukari cevirim s.calis(); // ?? © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 13 Arayüz (Interface) ile çoklu kalıtıma destek © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 14 Örnek • SportmenMehmet belki hem BuzPatenci hem de Basketbolcu olamayabilir ama bunlara ait özellikleri alabilir. Spor2.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 15 Arayüzlerin kalıtım (inheritance) yoluyla genişletilmesi • Bir arayüz başka bir arayüzünden türetilebilir. • Böylece arayüzler kalıtım yoluyla genişletilmiş olur. © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 16 © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 17 Yakından bakılırsı interface Avlanabilme extends DahaHizliKosabilme,Kosabilme { //.. } © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 18 Örnek Jaguar.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 19 Çakışmalar • Arayüzlerin içerisinde dönüş tipleri haricinde herşeyleri aynı olan gövdesiz (soyut) yordamlar varsa bu durum beklenmedik sorunlara yol açabilir. Cakisma.java (derlemeye çalışılırsa...) © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 20 public void hesapla(); // A1 arayüzüne ait public int hesapla(); // A3 arayüzüne ait © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 21 Arayüzün(Interface) içerisinde alan tanımlama • Arayüzlerin içerisinde gövdesiz (soyut) yordamların dışında alanlar da bulunabilir. • Bu alanlar, diğer uygulamalarda sabit olarak kullanılabilir. • Arayüzün içerisinde tanımlanan bir alan (ilkel tipte veya sınıf tipinde olsun) otomatik olarak hem public erişim belirleyicisine hem de final ve static özelliğine sahip olur. © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 22 Örnek AyBul.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 23 Arayüzün içerisinde tanımlanmış alanlara ilk değerlerinin verilmesi • Arayüzlerin içerisinde tanımlanmış alanların ilk değerleri, çalışma anında (runtime) da verilebilir. Test.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 24 Genel Bakış • Arayüzler (interface) ve soyut (abstract) sınıfların bizlere sağlamak istedigi fayda nedir ? © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 25 Genel Bakış • Aslında ulaşılmak istenen amaç çoklu yukarı çevirimdir (upcasting). GenelBakis.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 26 Yakından bakarsak class A extends Soyut1 implements Arayuz1, Arayuz2 { //...... } © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 27 © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 28 Soyut1 Arayuz1 Arayuz2 soyut_1 arayuz_1 arayuz_2 © Altuğ B. Altıntaş 2003 = = = new A(); (Arayuz1) soyut_1; // tip degisimi (Arayuz2) soyut_1; // tip degisimi Java ve Yazılım Tasarımı - Bölüm 7 29 Veya Soyut1 soyut_1 = new A(); Arayuz1 arayuz_1 = new A(); Arayuz2 arayuz_2 = new A(); © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 30 Dahili Sınıflar (Inner Classes) • Dahili üye sınıflar • Yerel sınıflar (Local classes) • İsimsiz sınıflar (Anonymous classes) © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 31 Dahili Üye Sınıflar class CevreliyiciSinif { class DahiliSinif { //.... } //... } © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 32 Örnek Hesaplama.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 33 Dahili Üye Sınıflar ve Erişim • Dahili üye sınıflara – public – friendly – protected – private erişim belirleyicileri atanabilir. Hesaplama1.java Hesaplama2Kullan.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 34 Türetilebilen Dahili Üye Sınıflar • Dahili üye sınıflar, aynı normal sınıflar gibi başka sınıflardan türetilebilirler. • Böylece çoklu kalıtım desteğinin bir benzerini (güvenli), Java programlama dilinde de bulabiliriz. © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 35 © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 36 Örnek YarisArabasi.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 37 Yerel Sınıflar (Local Classes) • Yerel sınıflar – – – – Yapılandırıcıların (constructor) Sınıf yordamlarının (statik yordam) Nesne yordamlarının Statik alanlara toplu değer vermek için kullandığımız statik bloğun – Statik olmayan alanlara toplu değer vermek için kullandığımız bloğun içerisinde tanımlanabilir. © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 38 Yerel Sınıflar public class Sinif { public void yordam() { public class YerelSinif { //... } } } © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 39 Yerel sınıflara ait ilk özellikler • Yerel sınıflar tanımlandıkları yordamın veya bloğun dışından erişilemezler. • Yerel sınıflar başka sınıflardan türetilebilir veya arayüzlere (interface) erişebilir. • Yerel sınıfların yapılandırıcıları olabilir. Hesaplama6.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 40 Yerel Sınıflara Ait İlk Özellikler - Devam • Yerel sınıflar, içinde bulundukları yordamın sadece final olan değişkenlerine ulaşabilirler. • Yerel sınıflar, statik veya statik olmayan yordamların içerisinde tanımlanabilirler. • Yerel sınıflar, private, protected ve public erişim belirleyicisine sahip olamazlar sadece friendly erişim belirleyicisine sahip olabilirler. • Yerel sınıflar, statik olarak tanımlanamaz. Hesaplama7.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 41 İsimsiz Sınıflar (Anonymous Classes) • Diğer dahili sınıf çeşitlerinde olduğu gibi, isimsiz sınıflar direk extends ve implements anahtar kelimelerini kullanarak diğer sınıflardan türetilemez ve arayüzlere erişemez. • İsimsiz sınıfların herhangi bir ismi olmadığı için yapılandırıcısı da (constructor) olamaz. Hesaplama8.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 42 Yakından bir bakış return new Toplayici() { public int hesaplamaYap() { // final olan yerel degiskenlere ulasabilir. return a + b ; } }; // noktali virgül sart © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 43 Neden Dahili sınıflar? • Arayüzler ile çoklu kalıtım (multiple inheritance) desteğini kısmen bulabiliyorduk ama bu tam değildi. • Dahili sınıfların var olmasındaki neden çoklu kalıtıma tam desteği sağlamaktır. © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 44 © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 45 Örnek TuretilmisSinif.java © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 46 Sorular ... © Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 47