abstract Sınıflar 1 Özet sınıflar ya da özet metotlar abstract anahtar sözcüğü kullanılarak tanımlanırlar. Bir temel sınıf içinde bildirilen abstract metotların içeriği boştur. Kendisinden yeni bir instance alınamayan ama miras veren sınıflarlardır. İçinde abstract metotlar bulunur ama bu metotların içi boştur ve bu metotlar override edilmek zorundadır, aksi halde derleyici hata verir. Abstract aslında bir yandan da virtual demektir, virtualda override zorunluğu yok iken abstract için bu zorunluluk vardır, aralarındaki fark budur. Eğer bir class içinde abstract metot kullanılacak ise bu classın da abstract olarak bildirilmesi gerekmektedir. Örneğin, base class içindeki bir metotta iş kurallarını uygulamıyorsak ama o metotun alt sınıflarda mutlaka olması gerekiyor ise ve iş kurallarını türeyen sınıflara bırakmak gerekiyor ise abstract yapmamız gerekir. Örneğin her bankanın para yatırma, para çekme vs gibi işlemleri her işlem içinde farklı farklı özelliklere sahiptir. Bir base class içinde abstract metot oluşturulur ve alt sınıflarda -türeyen sınıflarda- bu metotun ilgili özellikler tanımlanarak işlevi belirtilir. Tabi bu esnada türeyen sınıflarda mu method mutlaka override edilir. Abstract class içinde normal metotlar olabilir. Instance alınamaz ama referanslar oluşturabilir. Örneğin Sınıf diye bir class olsun. Bu class dan şu şekilde instance alınamaz. Sınıf sınıf1 new class Ama aşağıdaki şekilde referans alınabilir; Sınıf sınıf1; Özet metotlar private olarak tanımlanamazlar çünkü private olursa kendisinden türeyecek olan diğer sınıflar bu özet metodu devre dışı bırakamaz. 1 Bu başlık altındaki yazılar http://www.ismailgursoy.com.tr/ internet adresinden alınmıştır.
Görüldüğü gibi abstract sınıfından türemiş olan alt sınıflardaki aynı adı taşıyan metotlar override edilmiştir, aksi halde program derlenmez. Abstract classlardan nesne tanımlanamaz, yani instance alınamaz. Abstract sınıflar, abstract metotlar içerebilirler. Abstract metot tanımlanan bir class mutlaka abstract class olarak tanımlanmalıdır. Abstract classlar sealed anahtar sözcüğü ile ifade edilemezler, çünkü sealed ilgili sınıftan türetme yapılmasını engeller. Abstract bir classdan türeyen sınıflar base class içindeki bütün abstract metotları override ederek uygulamak zorundadır, yani metotun gerçek iş yapacak gövdeleri bu derived classlar içinde tanımlanır. Bütün abstract classlar aslında virtualdır. Static metotlar abstract olarak tanımlanamazlar. Abstract metot tanımlamasında override ve virtual sözcükleri kullanılmaz.
interface Kavramı 2 Öncelikle interface, Türkçe anlamı Arayüz olan, ve diğer classlara Rehberlik görevi üstlenen bir yapımızdır. Yaptığı iş sadece diğer classlara yön göstermektir. Bu yüzden Interface tanımları içerisinde kesinlikle kod bloğu bulunmaz. Interface yapılar sadece tanımlamalardan ibarettir, içerisinde hiçbir yapıcı metod bulunmamalıdır. Interface i diğer classlardan ayıran birçok özellik vardır. Ama en önemlisi: Bir class sadece bir classtan türetebilirken, bir class birden çok Interface ten türetilebilir. Yani, bir class a birden çok Interface ile rehberlik edebiliriz. public interface IBasliklar string Isim; string AnaBaslik; string AltBaslik; string Yazdir; public interface IUzunluk string En; string Boy; string Kalinlik; string Yazdir; Class oluştururken nasıl class parametresi kullanıyorsak, interface oluştururken de interface anahtar sözcüğünü kullanırız. Oluşturduğumuz interface isimlerinin, I ile başladığına dikkat çekerim. Bu bize kalıtım aldığımız class ta, kalıtım alınan şeyin bir interface olduğunu gösterir. interface oluştururken dikkat edeceğimiz maddeler aşağıda ki gibidir: interface ler yukarda bahsettiğim gibi Rehber görevi görürler. Yani içerisine herhangi bir kod parçası ekleyemeyiz. Sadece tanımlama yaparız. Bir interface in tüm üyeleri public kabul edilir. private, protected, static gibi tanımlanamazlar. Üyeleri public olarak ta tanımlayamayız, çünkü zaten hepsi public olarak tanımlanmış kabul edilir. Aksi halde hata alırız. Bir arayüzü, başka bir arayüzden türetebiliriz, fakat bir class tan yada struct dan türetemeyiz. interface leri miras alan sınıflar, içerisinde tanımlanan tüm metodları Implemente etmek zorundadır. Şimdi, Samsung adında bir classımız olsun ve yukarda tanımlanan interfacelerden IBasliklar arayüzünü miras alsın. 2 Bu başlık altındaki yazılar http://www.mshowto.org/c ile interface kullanimi arayuz nedir nasil kullanilirornek anlatimli.html internet adresinden alınmıştır.
Abstract classlarda gördüğümüz gibi karşımıza tüm metodları otomatik implement edecek seçenek çıkmaktadır. Fakat burda iki seçeneğimiz var, farklarını hemen açıklayalım. İlk seçeneğimiz zaten normal olanıdır, yani interface içerisinde ne kadar metod var ise implement edecektir. 2. Seçeneğimizde, Explictly keywordu vardır, Explictly: açıkça, bariz bir şekilde anlamına gelir ve bu şekilde implement edeceğimiz metodların hangi Interface ten türetildiği belirtilmektedir. Bu Explictly nin kullanım amacı da budur, yani karmaşıklığı önler. Implement işlemini Explictly olarak kullanma durumumuz, birden fazla Interface ten miras aldığımız zamanlar, aynı metod ismi 2 Interface lerde de olabilir. Bu karışıklığı önlemek için metod isimlerinin başına Interface isimleri gelmektedir. Örneğin yukarda tanımladığımız 2 Interface de Yazdır() metodu bulunmaktadır. 1 tane implement edilmiş public Yazdır() metodu varsa sorun olmaz, uygulama hata vermez. Ama ya 2 Yazdır() metodu da farklı işlemler yapıyorsa? O zaman aşağıdaki gibi tanımlarız. string IBasliklar.Yazdir return IBaslik Yazdır Metodu ; string IUzunluk.Yazdir return IUzunluk Yazdır Metodu ; Ve kod tarafında da aşağıdaki gibi çağırırız: Samsung S3 new Samsung; IBasliklar Baslik IBasliklarS3; IUzunluk Uzunluk IUzunlukS3; Baslik.Yazdir; Uzunluk.Yazdir; Evet, şimdi genel örneğimize geçelim, Samsung Classını hem IBasliklar, hemde IUzunluk Interface lerinden miras aldırtalım, metodları implement edelim. ( Yazdır() metodlarımız explictly olarak implemente edilecek) public class Samsung:IBasliklar,IUzunluk public string Isim return Model :Galaxy S3 ; public string AnaBaslik return Teknoloji ; public string AltBaslik return Telefon ; #endregion #region IUzunluk Members public string En return 70,6 mm ; public string Boy
return 136,6 mm ; public string Kalinlik return 8,6 mm ; public string IBasliklar.Yazdir return IBaslik Yazdır Metodu ; public string IUzunluk.Yazdir return IUzunluk Yazdır Metodu ; Bir Class, birden fazla Interface den kalıtım aldırılacak ise, Interface ler aralarına, konulur. (aşağıdaki gibi) class Samsung:IBasliklar,IUzunluk Ve Samsung adlı Class ımızı kullanarak verileri getirelim. static void Mainstring args Samsung S3 new Samsung; IBasliklar Baslik IBasliklarS3; IUzunluk Uzunluk IUzunlukS3; Console.WriteLineS3.Isim; Console.WriteLine Ana Başlık : S3.AnaBaslik; Console.WriteLine Alt Başlık : S3.AltBaslik; Console.WriteLineBaslik.Yazdir; Console.WriteLine; Console.WriteLine En : S3.En; Console.WriteLine Boy : S3.Boy; Console.WriteLine Kalınlık : S3.Kalinlik; Console.WriteLineUzunluk.Yazdir; Aldığımız sonuç aşağıdaki gibidir.