YZM 2105
Nesneye Yönelik Programlama
Yrd. Doç. Dr. Deniz KILINÇ
Celal Bayar Üniversitesi
BÖLÜM - 7
Kalıtım - II
Bu bölümde;
Soyut Sınıflar,
Arayüzler
ile ilgili konular anlatılacaktır.
Soyut Sınıflar
(Abstract Class)
• Kalıtım kavramını anladıktan sonra, sınıfların yaratılması daha da kolaylaşmaktadır.
• Child bir sınıf oluşturduğunuzda, gerekli olan genel özelliklerini kalıtır ve sonrasında sınıfa gereken yeni, spesifik özellikler kazandırılır.
– Örneğin; Ressam ile Sair sınıfları Sanatci sınıflarının daha da özelleşmiş halidir. Bu sınıflar, Sanatci sınıfının tüm özelliklerini ve metotlarını barındırmakla beraber spesifik özellikleri de barındırırlar.
Soyut Sınıflar
• Superclassları düşünmenin bir diğer yolu ise, subcasslarının ortak özelliklerinin tümünü düşünmek olabilir.
• Kalıtılmış sınıf incelendiğinde, ebeveyn sınıfının daha da genel olduğu gözlenir.
• Bazen child sınıfların daha genel bir örneğini oluşturmak için ebeveyn sınıf oluşturulur.
– Örneğin, önceden bir Sanatci yaratmamış olabilirsiniz;
Soyut Sınıflar (devam...)
Sonradan genişletilmek üzere yaratılan fakat kendisinden nesne oluşturulmayan sınıflara soyut sınıf (abstract class ) denir.
• Soyut sınıfları tanımlarken abstract anahtar kelimesi kullanılır.
• Soyut sınıflar da normal sınıflar gibi fiedlar ve metotlar içermektedir.
• Normal sınıflardan farklı olarak bu sınıflardan new operatörünü kullanarak nesne yaratılamaz. Bunun yerine, soyut sınıflar basitçe farklı nesnelerin kalıtımla yaratılması için bir ana sınıf sağlar.
• Metotlar gerekli olmasa da soyut sınıflar genellikle soyut metotlar(abstract methods) içerirler.
• Soyut bir metot hiçbir metot ifadesi içermez; bu sınıftan türetilen sınıflar da bu metotlara uygun bir şekilde uyarlanmalıdır. Diğer bir deyişle kalıtılmış sınıfta bu metotlar ezilmelidir.
Soyut Sınıflar (devam...)
• Soyut bir metodun başlığında, isteğe bağlı erişim belirleyicisi, abstract anahtar kelimesi, istenilen metodun tipi ve adı bulunur:
public abstract string Analiz();
• Soyut metotlara kıvırcık parantez sağlamasına gerek yoktur. Bu metotların gövdeleri kalıtılan sınıfta tanımlanır.
• Soyut bir sınıftan kalıtılarak yeni bir sınıf yaratıldığında, yeni sınıfta override anahtar kelimesini kullanarak soyut metotların gövdeleri oluşturulmalıdır.
Soyut Sınıflar (devam...)
• virtual anahtar kelimesi ile tanımlanan metot child sınıfta ezilmesi zorunlu değildir. Fakat abstract tanımlanmış metot ezilmelidir.
Soyut Sınıflar (devam...)
Hayvan adında soyut bir sınıf tanımlayınız.
Kurucu metodu aldığı argümanı Ad property’sine atayınız. Ad propertysini read-only olarak tanımlayınız.
Konus() adında string geri dönüş değerine sahip bir soyut metot oluşturunuz.
Örnek6: Hayvan Soyut Sınıfının Yaratılması
Hayvan sınıfı:
Örnek6: Hayvan Soyut Sınıfının Yaratılması
(devam...)
Kopek sınıfı:
Örnek6: Hayvan Soyut Sınıfının Yaratılması
(devam...)
• Soyut bir metot tanımlamadan da soyut bir sınıf oluşturulabilir fakat soyut sınıf oluşturulmadan soyut bir metot oluşturulamaz.
• Child sınıfında override edilmesi gereken metot kendi tanımına sahipse, bu metot virtual olarak tanımlanır. Eğer kendine ait bir tanım/gövde yoksa abstract olarak tanımlanır.
• Örnekteki Kopek sınıfında Konus() metodu ezilmek zorundadır. Bu metodun içerisinde herhangi bir işlem yapılabilir fakat bu metot mutlaka olmalıdır. Bu metodu ezerken override anahtar kelimesi kullanılır.
Soyut Sınıflar (devam...)
Hayvan adındaki soyut sınıftan Kedi adında bir sınıf oluşturunuz.
Hayvan sınıfından kalıtılan sınıflardan yaratılan nesnelerin
adlarını ve Konus()
fonksiyonunun sonucunu gösteren aşağıdaki gibi bir metot tanımlayınız.
Örnek7: Kedi Sınıfının Yaratılması
Hayvan sınıfı:
Örnek7: Kedi Sınıfının Yaratılması (devam...)
Kedi sınıfı:
Örnek7: Kedi Sınıfının Yaratılması (devam...)
HayvanBilgiGoster() metodu ve kullanımı
Örnek7: Kedi Sınıfının Yaratılması (devam...)
Kedi ve Kopek sınıfından yaratılmış nesneler Hayvan parametresi alan HayvanBilgiGoster() metoduna aktarılmıştır. Ad propertysi ve Konus() metodu çokbiçimli (polimorfik) bir şekilde , her nesneye uygun bir biçimde çalışır.
Örnek7: Kedi Sınıfının Yaratılması (devam...)
• Soyut sınıflar, birden fazla child sınıf için ortak özelliklerin ve/veya metotların ihtiyaç olduğu durumlarda ortak kısımları toparlama amacı ile kullanılabilirler.
• Soyut sınıf kullanımları önemlidir , ancak zorunlu değildir .
• Soyut sınıftan nesne türetilemez.
• Soyut sınıflar private olamazlar .
• Soyut sınıflar sealed olamazlar.
Soyut Sınıflar Özet
• GeometriHesaplamalar isimli soyut bir sınıf yaratınız.
Örnek: Geometri Hesaplamalar
GeometriHesaplamalar
Cevre: double Alan: double
abstract void CevreHesapla(double deger1, double deger2)
abstract void AlanHesapla(double deger1, double deger2)
• GeometriHesaplamalar sınıfından Cember, Kare, Dikdortgen sınıflarını türetiniz, Alan ve Çevre Hesaplamalarını Yapınız.
Örnek: Geometri Hesaplamalar
Arayüzler
(Interfaces)
• Bazı Nesneye Yönelik Programlama dilleri, bir child sınıfın birden fazla ana sınıfın özelliklerini barındırmasına izin vermektedir.
• Birden fazla sınıfın özelliklerini kalıtımına çoklu kalıtım (multiple inheritence) denmektedir.
• Çoklu kalıtım zor bir kavramdır ve kullanıldıklarında çok fazla hata ile karşılaşılmaktadır.
• En açık örneği ise parametre alan kurucu metoda sahip iki ayrı sınıfın özelliklerini barındırıyorsa hangisinin kurucu olarak kullanılacağıdır. Hangi ana sınıf temel alınmalıdır ?
Arayüzler
• Bütün bu sıkıntılarından dolayı çoklu kalıtım C# ta yasaklanmıştır. Fakat C# çoklu kalıtıma arayüz(interface) adında bir alternatif sunmaktadır.
• Soyut sınıflar gibi arayüzler, herhangi bir sınıfın üyelerinin ya da metotlarının koleksiyonudur.
• Bu metotlar herhangi bir sınıf tarafından, arayüzün soyut metotlarının tanımı sağlandığı sürece (override edildiği sürece) kullanılabilirler.
Arayüzler (devam...)
• Bir arayüz tanımlanırken interface anahtar kelimesi kullanılır.
• Arayüz adlandırmaları, başına ‘I’ harfi eklenerek sonuna da “-able / -ebilen“ eki getirilerek yapılır.
interface ICalisabilen {
string Calis();
}
• Herhangi bir sınıf ICalisabilen arayüzünü implemente ettiğinde, ayrıca geriye string ifadesi döndüren Calis() metodunu da içermiş olur .
Arayüzler (devam...)
ICalisabilen adında, string Calis() metoduna sahip arayüzü yaratınız. Yarattığınız bu arayüzü Isci, Kopek ve Kedi sınıflarına implemente ediniz. Calis() metodu sınıflara göre geriye döneceği ifadeler şu şekilde düzenlenmelidir:
Örnek8: ICalisabilen Arayüzünün Yaratılması ve Kullanımı
Sınıf Adı Calis() Metodunun Geriye Döneceği İfade
Isci «İşi yaparım»
ICalisabilen arayüzü:
Örnek8: ICalisabilen Arayüzünün Yaratılması ve
Kullanımı (devam...)
Isci sınıfı:
Örnek8: ICalisabilen Arayüzünün Yaratılması ve
Kullanımı (devam...)
Hayvan sınıfı:
Örnek8: ICalisabilen Arayüzünün Yaratılması ve
Kullanımı (devam...)
Kopek sınıfı:
Örnek8: ICalisabilen Arayüzünün Yaratılması ve
Kullanımı (devam...)
Kedi sınıfı:
Örnek8: ICalisabilen Arayüzünün Yaratılması ve
Kullanımı (devam...)
Nesnelerin yaratılması ve Calis() metotlarının kullanımı:
Örnek8: ICalisabilen Arayüzünün Yaratılması ve
Kullanımı (devam...)
• ICalisabilen arayüzü her implemente edildiğinde Calis() metoduna bir gövde tanımlanmalıdır.
Calis() metodu tanımlandığı sınıfa göre işlem yapar.
• Arayüzlerden nesne yaratılamamaktadır .
• Soyut sınıfların arayüzlerden farkı ise soyut olmayan metotlar barındırabilmeleridir.
• Arayüzlerin barındırdığı tüm metotlar soyut olmalıdır.
Arayüzler (devam...)
Bir sınıf sadece bir sınıftan türetilebilir fakat birden fazla arayüzü implemente edebilir.
– Örneğin Cocuk sınıfını ele aldığımızda, Yetiskin sınıfından türetilerek oluşturulmuştur. Aynı zamanda iki arayüzü de implemente etmektedir: ICalisabilen ve IOynayabilen.
class Cocuk : Yetiskin, ICalisabilen, IOynayabilen
• Diğer uygulamalarda bulunan bir metodu barındıran bir sınıf yaratmak için önceden var olan bir arayüz implemente edilir.
Arayüzler (devam...)
Başlangıçta ne zaman arayüz (Interface) ne zaman soyut sınıf (Abstract Class) kullanılacağına karar vermek zordur. Abstract bir sınıfın bütün metodlarını abstract yaparak onu da aynı bir interface gibide kullanabiliriz.
• Tipik olarak, child sınıflara bazı verilerin ve metotların aktarılması isteniyor ve bunlardan bazılarının ezilmesi gerekiyorsa soyut sınıflar kullanılır.
• Her bir metot ezilmek istenilirse arayüz oluşturulur.
Arayüzler (devam...)
Nesnelerin daha spesifik bir örneğini oluşturmak istiyorsak soyut sınıflar, davranışlarının benzemesini istiyorsak
arayüzler yaratılır.
• Abstract sınıfların genellikle IS-A (dır,dir) ilişkilerinde, kalıtım(inheritance) özelliğini kullanarak kod tekrarını azaltmak için kullanılır.
• Interface sınıfların ise daha çok CAN-DO (yapabilir..) tarzı ilişkilerde değişen kavramları uygulamadan
Arayüzler (devam...)
• Belli başlı oyuncaklarımız var.
• Oyuncakların hepsi farklı özelliklere sahiptir ve bu özellikler Interface’ler kullanılarak ayrılmak istenmektedir.
– Sürülebilen – Uçabilen – Yüzebilen – Ateş edebilen – Mıncıklanabilen
Örnek9: Oyuncakçı Uygulaması
• class OyuncakBase
public string Kod { get; set; } public string Ad { get; set; }
public double Fiyat { get; set; }
public string Barkod { get; set; }
public float Agirlik { get; set; }
Örnek9: Oyuncakçı Uygulaması (devam…)
• ISurulebilen
– void Ilerle(float mesafe) – void Don(float derece) – void Dur()
• IYuzebilen: ISurulebilen
– float Dal(float derinlik)
38 Celal Bayar Üniversitesi - YZM 2105 Nesneye Dayalı Programlama