Nesne Yönelimli Programlama – 9: Interface

Merhaba; yazılım dünyasının merdivenlerini tırmanmaktan vazgeçmeyen dostlarım. Başlıktan da anladığınız üzere; Muhteşem Yüzyıl dizisinden daha heyecanlı olan (ya da bana öyle geliyor 🙂 ) yazı dizimize Interface konusu ile devam ediyoruz.

Interface’in kelime anlamı olan “arayüz”e takılırsanız işin içinden çıkamazsınız baştan söyleyeyim :). İçinizden “o zaman adını neden interface koymuşlar” diyor olabilirsiniz. Elbette bunun mantıklı bir sebebi var ve birazdan bu sebebi anlayacaksınız da. Gelin önce basit bir tanımla başlayalım; Interface’ler, geliştirdikleri (iplemente ettikleri) sınıflara yetenek kazandıran yapılardır. Yani “tip” oldukları söylenemez. Peki bir interface’e ne zaman ihtiyaç duyarız? İşte bu sorunun yanıtını verebilmek için, sınıf üyelerinin (metod, olay ve özellik) bir yeteneği temsil edip etmediğini nasıl anlarız sorusuna cevap vermemiz gerekiyor. Haydi bakalım .NET kasabasının meşhur Object Oriented Lokantasına bir uğrayalım.

Söz konusu lokantamızda elbette bir çok nesne mevcut. Ama ben, bu lokantadaki insan nesnesi üzerinde duracağım. Efendim lokantamızdaki insanlar başlangıç olarak ikiye ayrılıyor; çalışanlar ve müşteriler. Davranışsal olarak birbirlerinden farklı olan bu iki nesne için çözümü görebiliyorsunuz sanırım: abstract bir insan sınıfı. Hem çalışan hem de müşteri sınıflarına miras veren bir temel sınıf. Peki, siz bu lokantaya müşteri olarak girdiniz. Masanıza oturdunuz ve kararınızı verdiniz. Şimdi sipariş verme zamanı. Peki… Kime sipariş vereceksiniz? Ya da daha doğrusu, garsonu nasıl tanıyacaksınız? Yakasındaki isimliğinden veya giydiği kıyafetten öyle değil mi? İşte interface! O kıyafet, abstract insan sınıfından türemiş olan çalışan sınıfına garsonluk “yeteneği” kazandırıyor. Ya da başka bir deyişle garson o kıyafeti giyerek; “sipariş al” metodunu iplemente ediyor.

Bu teorik örnek sanıyorum; Interface’e ne zaman ihtiyaç duyacağımız sorusuna cevap veriyor. Ama elbette, kod örneği yapmadan şuradan şuraya göndermiyorum sizi… Örneğimiz, Counter Strike tarzı bir oyun üzerine olacak (aslında Diablo III’e özel bir örnek yapmak niyetindeydim ancak, oradaki silahlar daha karışık). Önce nesne modelimizi oluşturalım:

Oyuncu sınıfımızın basitçe bir görüntüsü. Bu sınıfın “OyuncununSilahi” isimli property’si, geriye Silah sınıfından bir nesne döndürüyor. Silah sınıfı da tahmin edersiniz ki abstract bir sınıf. Çünkü, oyunumuzda hem ateşli silahlar hem de kesici silahlar mevcut ve her ikisi de bambaşka özellikleri olan sınıflar. Öyleyse durum aşağıdaki gibi:

 

Peki, oyuncu sınıfında yer alan “NisanAl” metoduna odaklanalım. Bu metod, oyuncununSilahi özelliğinden dönen nesnenin türüne göre bir davranış sergileyecek. Yani, eğer oyuncunun dürbünlü bir silahı varsa; hedef yakınlaştırılacak, dürbünsüz ise; göz gez arpacık görünümüne geçecek ya da oyuncuda bıçak varsa, bıçağı dik konuma getirecek. Bu noktada, bunu sağlamak için ne yapacağız? Bir an için abstract silah sınıfına “yakınlaştır” isimli bir abstract metod yazdığımı düşünelim. Ama o zaman KesiciSilah sınıfında da “yakınlaştır” metodu oluyor. Burada bariz bir mi mari hata var. Biz bu duruma kısaca WTF (What the folk 😛 ) diyoruz.

İşte o zaman anlıyoruz ki, bir silahın dürbünlü olması, o silahın “yeteneği”dir. İşte şimdi gerçekten bir interface’e ihtiyaç duyuyorsunuz. Haydi kolları sıvayalım

Interface’in bir sözleşme olduğunu düşünelim. Bu sözleşmeyi bir sınıfın kabul etmesi demek, sözleşme içerisinde yer alan tüm üyeleri bulunduracağını taahhüt etmek demektir. Bu açıklamaya göre, Interface içerisindeki hiçbir üye access modifier içermemelidir. Çünkü bu üyeler, implemente eden sınıfta public olmak zorundadır. Ayrıca interface üyeleri gövde kodu da içeremezler. Amaçları sadece kalıp oluşturmaktır.

Şimdi dürbünlü bir ateşli silah ekleyelim ve IYakınlastirilabilir interface’ini de iplemente etmesini sağlayalım:

M51 isimli silah, yakınlaştırma “yeteneğine” sahip dürbünlü bir silah oldu gördüğünüz gibi. İşte şimdi, oyuncu sınfımda yer alan “NisanAl” metoduma geri dönebilirim.

Burada gördüğünüz gibi önce OyuncununSilahi özelliğinin Interface’imi implemente edip etmediğini soruyorum. Eğer etmişse Interface’den geçen üyeleri zoom isimli nesneye atıyorum. Ardından da Yakinlastir() metodunu çağırıyorum.

 

… Ve final:

Çıktı:

 

İşte sevgili dostlarım; interface’in kullanımına dair minik bir örnek size… Aman yanlış anlaşılmasın; Interface’in buradaki kullanımı sadece bir pattern. Karşınıza interface’in karşınıza çıkabileceği bir çok senaryo var. Artık onları araştırmak da size düşüyor.

O zaman; bir makalemizin daha sonuna gelmiş bulunuyoruz sevgili dostlarım. Sağlıcakla kalın.

10 thoughts on “Nesne Yönelimli Programlama – 9: Interface

  1. Türkay hocam yine döktürmüşsünüz gerçekten süper bi anlatım çok teşekkürşer OOP’i sizden öğrendim valla başka hiçbir kaynağa ihtiyaç duymadım diyebilirim yakında görüşmek üzere hocam… Ellerinize,düşüncenize sağlık.

  2. Kelimeler kifayetsiz kalıyor bu anlatımı tanımlamaya,sade
    net, keskin, kolay anlaşılır, eğlenceli, sıkıcı olmadığı için anlaması kolay,sade ve net olması sebebiyle kolay anlaşılır…
    Tüm yazı dizisini sıkılmadan sevdiğim bir romanı okur ve en kolay anladığım dersi çalışır gibi keyif aldım.
    Bu başarılı anlatımınız için tebrikler;
    emek ve zaman harcadığınız için teşekkürler.

  3. Merhabalar bir sorum olacaktı.Oyuncu classındaki oyuncununSilahi adlı property Silah sınıfından bir nesne döndürüyor kısmını anlayamadım bu kısmı detaylandırabilir misiniz?
    Tesekkür ederim ….

Leave a Reply