Merhaba Arkadaşlar,
C# OOP kullanımın bir güzelliği ile yine beraberiz.
Daha önce inheritance (kalıtım, miras) almayı görmüştük.
inheritance bize güzel bir kolaylık getirmişti. Ama bir sınıf ancak bir adet miras alabiliyordu. (insan:Canlı) yani şu şekilde bir yapı yoktu; Öğrenci:İnsan:Canlı
İşte tamda bu noktada C# ın yazılımcı abileri “İnterface” diye bir yapı ile bunu çözmüşler. İnterface türkçe kelime anlamı “Arayüz” olsa da gözümüzde canlandığı gibi değişik ekranlarla karşılaşmayacağız.
Bu yapıda miras alırken istediğimiz kadar miras alabileceğiz.
Interface, kendisinden kalıtım alacak bir sınıfın ana hatlarını belirler.
Örneğin bir sınıfın içerisinde property’ler,metotlar vs. yer alacaksa bunları sınıfın içine yazmak yerine interface denilen yapıya yazar ve bu interface’den defalarca istediğimiz sayıda sınıfa kalıtım vererek ana hatlarını belirleriz.
Az öncede dediğim gibi interface, kendisinden kalıtım alacak olan sınıfların ana hatlarını içerir ancak interface içerisine örneğin metodun ne yapacağı yazılmaz.Yani detaycı bir yapı değildir.
Gelin şimdi Visual Studio’yu açalım ve interface konusunu biraz inceleyelim.
Bilgisayar üzerine bir proje yapalım ve konumuza “Bilgisayar” adında bir içi boş class ile başlayalım.
Şimdi bir bilgiyarın parçalarını düşünelim; İşlemci, ram, hdd, ekran kartı, ses kartı, Anakar vb. bir sürü parça bulunmaktadır.
Şimdi bu parçaların hepsini ayrı ayrı sınıflarla tanımlarsak “Bilgisayar” classımızda bu özelliklerin hepsini içeren sınıfları miras alamayız.
ama bunun yerine bu parçaları İnterface olarak tanımlarsak?
O halde her bileşeni birer interface olarak kullanarak kalıtım alabilmek oldukça akıllıca olacaktır.
Interface’ler konusunda bilmemiz gereken ilk genel kültür konusu ise interfacelerin adının başına “I” büyük harfle konulması gerektiğidir.Böylece Solution Explorer penceresinden bir dosyanın interface’mi yoksa class’mı olduğunu kolaylıkla alyabiliriz,bunu yapmakta zorunlu degiliz ama büyük çaplı projelerde işimize yarar.
İlk önce islemci adında public erişim belirleyicisi ile bir interface tanımlayım ve içini biraz dolduralım.
Çok basit bir manada bir interface oluşturduk ve bu interface’imiz görüldüğü gibi üç property ve bir de metot
içeriyor..Şimdi gelelim oluşturulan bir interface nasıl kullanılır görelim…
Bilgisayar classımıza geri dönüyoruz ve tıpkı daha önce öğrendiğimiz gibi sınıfımızın adının yanın iki nokta ile
interface’imizin adını yazıyoruz:
Ardından Visual Studio bize implicitly (doğrudan) mi yoksa klasik kodlama(implement) mı kalıtım alacağımızı soruyor.Bu şu demektir: işlemci interface’inden alacağımız kalıtım ile sınıfımıza gelecek olan property ve metot gibi üyelerin nereden geldiğini detaylı olup olmayacağını soruyor.Daha sade bir anlatımla her üye hangi interface’den geliyorsa başına o interface’in yolunu ve adını yazar.
Bu örneğimizde gerek duymadığımız için klasik seçeneğini seçtikten sonra sınıfımızın property ve metotları şu şekilde geliyor:
Metotlara bakarsak sanki elle yazmış gibi otomatik bir şekilde gayet güzel geliyor ancak property’ler o kadar basit
bir şekilde gelmiyor ve Visual Studio diyor ki;
Nasıl ki interface’den gelen metodun içi boş geliyor ve içeriğini istediğin gibi yazıyorsan, interface’den gelen
property’leri de aynen o şekilde kullan..
Bu yüzden her property ve metodun içeriğinde başlangıç olarak Throw new NotImplementedException (kodlanmamış yeni bir istisnai durum yürüt – göz göre göre hata ver ki yazılımcı eksik kod yazdığının farkına varsın.
Tam da böyle bir cümlenin ardından field (alan) adında yeni bir kavramla karşılaşıyoruz.Field denen küçük yapıyı global
bir değişken olarak düşünebilirsiniz ve field’ler property’lerin kendilerine anlam kattıkları nesnelerdir.
Örneğin işlemciminizin hızını nasıl double cinsinde gösteriyorsak hemen double tipinde bir field oluşturalım:
Bu field’in başına public gibi erişim belirleyicisi koymadık çünkü bu sınıf dışında dışarıdan bu field’e erişmek için yine double tipindeki işlemci hızı property’sini kullanacağız.O yüzden field’lerin genel yazılım kodlama standartlarındaki
yeri property’ninkiyle oldukça yakın durur.
Şimdi islemcihızı isimli property’mize odaklanıyor ve get ile set adında iki yeni daha kavram görüyoruz:
Get’in Türkçe karşılığı (elde etmek), set’in Türkçe karşılığı ise (ayarlamak,tanımlamak,kurmak) şeklindedir.Get o property’den dışarıya vermek istediğimiz değeri temsil ederken, set ise o property’nin alacağı değeri temsil eder.Yani get ve set bir property’nin değer alıp verebilmesini sağlar.
İşlemcihizi property’mizin get bloğuna _hiz isimli field’ımızı tanımlıyor ve return sözcüğüyle geri döndürüyoruz.Aslında demek istediğimiz olay şudur:bu metot _hiz isimli field’in değerini geri döndürür.
Set bloğuna ise _hiz field’ımıza dışarıdan bir değer (value) yüklenebilmesini istiyoruz:
Bir property’nin get ve set kısımları oldukça esnek oldukları için istediğiniz gibi kullanabilirsiniz.Mesela hızın _hiz*10 ile
10 katını get bloğunda return diyerek geri döndürebildiğiniz gibi set bloğunu kaldırarak _hiz field’ına bir değerin verilmesini engelleyebilirsiniz.
Bir sınıf birden çok interface’den kalıtım alabilir ve aldığı her interface’den gelen property ve metotları bünyesinde barındırabilir.Bu sayede tek bir sınıftan kalıtım alabilmenin ötesine geçer..
Şimdi Ram isimli bir interface daha oluşturuyor ve içerisine bellek boyutu ile bellek tut isimli birer property ve metot yazıyoruz:
ve birde Hard disk için bir interface oluşturalım.
Şimdi “Bilgisayar” sınıfımıza gidelim ve bütün bu interfaceler den hep beraber kalıtım alalım (MULTİ İNTERFACE)
ilk başta islemci interface den kalıtım aldığımızda olduğu gibi ram ve hdd interface ileri içinde property ve metotlar yine sınıfımızın içerisine gelecektir.
Gördüğünüz gibi interface’ler içerisine ne yazdıysak hepsi birer birer tek sınıf altında gayet güzel bir şekilde geldi,biz de bu üyelere değerler verelim ve metotlarını da formumuzun load ında çağıralım:
Olay budur.
Saygıılar.