Upload
metehanates
View
4.449
Download
2
Embed Size (px)
Citation preview
OOP’nin Temel İlkeleri
•Soyutlama(Abstraction)•Sarmalama(Encapsulation)•Çok-Şekillilik(Polymorphism)•Miras Alma/Kalıtım(Inheritance)
1. Bölüm SOYUTLAMABir nesnenin belirli alanlarını dış
dünyadan ayrı tutma işlemidir.OOP’nin bu kıstası, programcıyı,
nesne ile ilgili anlaşılması güç işlevlerden soyutlamayı amaçlamaktadır.
Kaç kişi araba kullanırken, motorun içerisinde olup bitenle ilgilenir.
2. Bölüm SARMALAMABir nesnenin içerisindeki bazı özel üyeleri
kullanıcılardan gizleyebilme özelliğidir.Programcıyı ilgilendirmeyen veya belirli
arabirimler üzerinden erişilmesi istenen alanları saklamaktır.
Verilere dışarıdan gelebilecek bozulmalara, yanlış kullanımlara karşı korumaktır.
Nesne içerisindeki yerel alanları, özelliklerle veya erişim belirleyicilerle sarmalarız.
2.1 Erişim Belirleyicilerpublic (Tüm erişimlere açık)private (Sadece üyesi olduğu
sınıftan erişilebilir)protected (üyesi olduğu sınıftan
ve bu sınıftan türetilmiş sınıflardan ulaşılır)
internal (aynı program (assembly) içerisindeki sınıflardan erişilebilir)
privateYerel üyeDışarıdan hatta bu sınıftan
türetilmiş sınıflardan bile erişilemeyeceği anlamına gelir.
publicBu üyeye her yerden erişilebilir.
public class Islem{ public string StoreID; private double Total;
public Array GetOrderDetail() { //kod bloğu }
private void CalTotal() { //kod bloğu }}
Örnekte GetOrderDetail() fonksiyonu ve StoreId değişkeni publictir, CalTotal() yordamı ve Total değişkeni privatedir.
Ana fonksiyonda Islem objIslem=new Islem(); objIslem.
dediğimizde public üyeler görünür, private üyeler görünmez.
protectedKendi sınıfının diğer üyeleri
tarafından erişilebildiği gibi sınıfından türetilmiş sınıflardan da erişilebilir.
Kendi sınıfında private, türetildiği sürece publictir.
internalSadece aynı uygulama içerisinde
olan sınıflar tarafından erişilmeyi sağlar.
Sözkonusu üye, kendisiyle birlikte derlenmiş kodlar tarafından erişilir.
Assembly1.dllpublic class Islem(){ internal string StoreId; //kod blogu}public class Islem2(){ public void SaveOrder() { Islem1 objIslem1=new Islem1(); obIslem1.StoreId=“AF01”; //erişilebilir }}Assembly2.dllpublic class Islem(){ public void SaveOrder() { Islem1 objIslem1=new Islem1(); obIslem1.StoreId=“AG07”; //erişilemez }}
protected internal• Bu ifade hem aynı projedeki
sınıflar hem de aynı projede olmayan, fakat üyenin ait olduğu sınıftan türetilmiş sınıflar tarafından kllanılabilir.
Önüne erişim belirleyici konulmayan sınıf üyesi default olarak private muamelesi görür.
class ve struct gibi yapılar internal ve public olabilir. Bunlar varsayılan olarak internal özelliğine sahiptir.
İç içe sınıflarda(nested class) sınıf protected, protected internal ve private olabilir. İç ice struct protected veya protected internal olamaz.
Arabirimler sınıflar gibi public veya internal olabilir. Arabirim üyeleri her zaman publictir.
Blok adı Varsayılan erişilebilirlik
İzin verilen erişilebilirlik
Üyelerin erişilebilirliği
Enum Public public None
Class İnternal İnternalPublicPrivate(nested class)Protected(nested class)
PublicProtectedİnternalPrivateProtected internal
Struct İnternal İnternalPublicPrivate(nested class)
PublicİnternalPrivate
Interface public Public internal None
3. Bölüm ÇOK-ŞEKİLLİLİKAynı isimdeki yordamların
duruma göre farklı işlemler yapmasıdır.
Bu biçim değişikliği bazen nesnelere göre bazen yordamlara gönderilen parametreler göre gerçekleştirilir.
Bu işlemi iki şekilde sağlayabilir. Arabirim ve kalıtım yoluyla. Bu bölümde arabirime değineceğiz. Kalıtım yoluyla olanı sonraki konuda işlenecek.
3.1 Yeniden yükleme (overloading) Aynı sınıf içerisinde parametre sayısı ve
türü farklı olmak koşuluyla aynı isimde birden çok yordam tanımlanabilir.
Derleyici hangi yordamı çalıştıracağını signature işlemiyle anlar.
Bir yordamın signature bilgisi yordamın adı, parametre türü, parametre sırası ve paremetre erişim niceleyicisidir.
Parametre ismi veya yordamın geri dönüş türü signature bilgisini etkilemez.
static void Main(string[] args) { Console.WriteLine("1. versiyon sonucu : {0}", Toplama("Ali")); Console.WriteLine("2. versiyon sonucu : {0}", Toplama(5,6)); Console.WriteLine("3. versiyon sonucu : {0}", Toplama(7,8,4)); Console.ReadLine(); }
static string Toplama(string Deger) { return "Lütfen sayısal değer giriniz"; }
static int Toplama(int X, int Y) { return X + Y; }
static int Toplama(int X, int Y, int Z) { return X + Y + Z; }
1. versiyon sonucu : Lütfen sayısal değer giriniz2. versiyon sonucu : 113. versiyon sonucu : 19
Yapıcı yordamlar da yeniden yüklenebilir. İlgili sınıftan bir nesne oluşturulmaya çalışılırken, yapıcı yordama ne sayıda veya ne türde parametre gönderildiği önem kazanır.
static void Main(string[] args) { //Islem objIslem = new Islem(); //hatalı olacaktır. Islem sınıfının parametre almayan yapılandırıcısı bulunmamaktadır. Islem objIslem1 = new Islem(2011); Islem objIslem2 = new Islem("www.halilsahin.com"); Console.ReadKey(); } public class Islem { public Islem(int Deger) { Console.WriteLine("Nümerik değer gönderildi." + Deger); } public Islem(string Deger) { Console.WriteLine("String değer gönderildi. " + Deger); } }Nümerik değer gönderildi. 2011String değer gönderildi. www.halilsahin.com
public int DataAl(byte Id) { return null; } public string DataAl(byte Id) { return null; } //hata verecektir. CLR overload işlemini çözmek için //sadece yordam ismi ve parametre listesini değerlendirmeye //alır
static void Main(string[] args) { SqlCommand obj = new SqlCommand(); Islem(obj); byte x = 96; Islem(x); Islem(256); Islem(3.14); Console.ReadKey(); } static void Islem(object Deger) { Console.WriteLine("Nesne gönderildi"); } static void Islem(byte Deger) { Console.WriteLine("Byte gönderildi."); } static void Islem(int Deger) { Console.WriteLine("Integer gönderildi."); } static void Islem(double Deger) { Console.WriteLine("Double gönderildi"); }
Son örnekte; overload edilmiş yordamların parametreleri, birbirine dönüştürülebilir ise CLR otomatik olarak en üst tipi seçer.
Byte türü integer’e, float türü double türüne dönüştürülmesi gibi.
3.2 ArabirimlerSınıf ve struct gibi türler için oluşturulmuş
modele arabirim denir.Arabirimler bir sınıfın temelde hangi
üyelerden oluşacağını belirleyen şablonlardır. Bu şablonlar oluşturulacakları sınıflara öncülük eder. İçermeleri gereken üyelerin tanımlamaları için yol gösterir.
.NET Framework, çoklu kalıtımı sınıflarla değil arabirimlerle destekler.
Bir sınıf birden fazla arabirimden farklı ögeler alarak yetenekli hale gelebilir.
Amacı hem sınıflar tanımlanırken daha önce tanımlanmış üyelerin o sınıf için oluşturulmasını garanti etmek hem de farklı sınıflar için aynı şablonları kullanmaktır.
Arabirimler üyelerin içeriklerini, yani gerçekleştireceklerini içermeyip sadece tanımlamalarını boş hallerini içerir.
Arabirimler interface sözcüğüyle tanımlanır.
public interface IArac { string Tekerlek { get; set; } string VitesDegistir(byte X); void Hızlan(); void Yavasla(); } public interface IBoyut { string Genislik { get; set; } string Yukseklik { get; set; } }
class Otomobil : IArac, Iboyut { public string Tekerlek { get { return null; } set { /*gerçekleşecek kodlar*/ } } public string VitesDegistir(byte X) { return null; } public void Hızlan() { //gerçekleşecek kodlar } public void Yavasla() { //gerçekleşecek kodlar } public string Genislik { get { return null; } set { /*gerçekleşecek kodlar*/ } } public string Yukseklik { get { return null; } set { /*gerçekleşecek kodlar*/ } } }
Alanların kodları ve ne yapacakları sınıf içerisinde belirtilmiştir.
Yapıcı yordam, yıkıcı yordam ve alanlar arabirimler içerisinde tanımlanamazlar.
Arabirimlerin üyeleri private olarak tanımlanamaz, public olarak tanımlandı kabul edilir.
Arabirimi uygulayan sınıf, arabirimin tüm üyelerini kullanmak zorundadır. Bununla birlikte sınıf kendine ait üyelere de sahip olabilir.
Bir arabirim yapı veya sınıftan türetilemez; ama başka bir arabirimden türetilebilir.
public interface ICanli { void NefesAl(); } public interface IInsan { void NefesAl(); } public class Uye : ICanli, IInsan { void ICanli.NefesAl() { Console.WriteLine("Canli NefesAl"); } void IInsan.NefesAl() { Console.WriteLine("Insan NefesAl"); } }
static void Main(string[] args) { Uye objUye = new Uye(); ICanli obj1 = (ICanli)objUye; IInsan obj2 = (IInsan)objUye; obj1.NefesAl(); obj2.NefesAl(); Console.ReadLine(); }
Burada karşımıza şöyle bir sorun çıkabilir. Gerçekten Uye sınıfı Icanlı ve Iboyut arabirimlerine dönüştürülebilecek yeteneğe sahip mi? DurumuBuna izin veriyor mu? Bunu is operatörüyle kontrol edebiliriz
public interface IArac1 { string Tekerlek { set; } void Hızlan(); }
public interface IArac2 { string VitesDegistir(byte X); void Yavasla(); }
class Otomobil : IArac1 { public string Tekerlek { set { /*işlemler*/ } } public void Hızlan() { } }
static void Main(string[] args) { Otomobil objOtomobil = new Otomobil(); IArac1 Tasit1 = (IArac1)objOtomobil; IArac2 Tasit2 = (IArac2)objOtomobil; // bu satır hata verir. Çünkü //otomobil sınıfı IArac2 üzerinde uygulanamaz. if (objOtomobil is IArac2) Console.WriteLine("Otomobil sınıfı IArac2 arayüzünü uygulayabilir."); else Console.WriteLine("Otomobil sınıfı IArac2 arayüzünü uygulayamaz."); Console.ReadKey(); }
3.3 Soyut SınıfSınıfların örnek alacağı ana sınıf şablonunu
temsil eder.Soyut sınıfta, sınıflarda olması gereken öğeler
tanımlanıyor ve bundan türeyecek sınıflarda bu öğelerin kullanılmasına imkan veriliyor.
Arabirim ile soyut sınıf arasındaki en önemli fark, arabirim, öğelerin sadece tanımlamalarını içerirken soyut sınıf, öğelerin hem tanımlamalarını hem de içeriklerini içerir.
abstract sözcüğüyle tanımlanan soyut sınıflar doğrudan kullanılamazlar. Bir sınıfın kendilerinden türetilmelerini beklerler.
public abstract class Arac { public void FreneBas() { Console.WriteLine("Arac durdu."); } public abstract Decimal Genislik { get; } } public class Araba : Arac { public override decimal Genislik { get { return 2.8M; } } }
static void Main(string[] args) { Araba objAraba = new Araba(); objAraba.FreneBas(); Console.WriteLine(objAraba.Genislik.ToString()); Console.ReadKey(); }
Örnekte görüldüğü gibi Arac sınıfı FreneBas() yordamını kendisi gerçekleştirmiş, Ancak Genislik özelliğini kendisini kullanacak sınıf tarafından gerçekleştirmesiniistemiştir. Eğer araba sınıfında Genislik özelliğini düzenlemezsek derleyici hataverir.
özellik arabirim Soyut sınıf
Çoklu kalıtım Bir sınıf birden fazla arabirimden miras alabilir. Struct da miras alabilir.
Bir sınıf sadece bir soyut sınıf tarafından miras alınabilir.
İşlem gerçekleştirme İşlem kodu içermez. Sadece tanımlamaları içerir.
İşlem yapacak yordamları ve içeriklerini içerebilir.
Yeni özellik ekleme Yeni bir öğe eklendiğinde arabirimi uygulayan sınıflarda arabirim öğelerini revize edilmek gerekir.
Öğe eklendiğinde diğer kodlarım doğru çalışmaya devam eder.
Soyut üyeler Üyeler soyut üyelerdir. Soyut veya soyut olmayan üye içerebilir.
Erişim niteleyici Öğeler public kabul edilir. E.N kullanılamaz.
Erişim niceleyicilerine sahiptirler.
Statik üye Arayüzlerde üyeler statik olarak tanımlamaz.
Üyeler stataik tanımlanabilir.
Üyeler Üyeler sadece yordam, olay, özellik veya indeksleyici olabilir. Constructer veya decons olamaz.
Tipik bir sınıfın tüm üyeleri olabilir.
4. Bölüm KALITIM