Kendime not : OOP Kavramları (Özet Bilgi) — 2.Kısım

Bir önceki kısımda temel olarak OOP prensiplerine gelmeden önce bilinmesi gereken basic kavramlardan bahsetmiştim. En temel ögeden başlayarak OOP basamaklarını çıkmaya devam edeceğiz.Bu sebeple aşağıdaki görseli gerçekten çok beğendim.

Öncelikle birinci kısımda nesne ve sınıfın ne olduğunu , sınıf türlerini , sınıf üyelerini , erişim belirteçlerini vs tanımlamıştım. Eğer hala hatırlayamıyorsak : tık tık ! Yani kısaca ilk 2 basamağı çoktan atladık bile.

Sıradaki basamakları OOP nin 4 temel prensibi olarak tanımlıyoruz.

Artık bu noktadan itibaren daha derinlere dalmaya başlayacağız demektir.

3.Basamak : Inheritance (Miras Alma , Kalıtım)

Inheritance,OOP(Object Oriented Programming /Nesne Yönelimli Programlama) tekniklerinden birisidir.Sınıflar arası hiyerarşik yapı kurabilmek, oluşturmak için kullanılır.Bir sınıf,başka bir sınıftan türeyerek(kalıtım alma) , o sınıfın public ve protected tanımlı yapılarını devralır.

Kalıtım alan sınıfa : Derived Class ,(Türeyen sınıf )
Kalıtım veren sınıfa : Base class denir.(Türeten sınıf )

C# da oluşturulan her class aslında Object classından türemiştir.Yani her class object classından otomatik türetilir.Bir sınıf yazıp,oluşturduğumuz sınıftan nesne yaratırsak eğer,o nesnenin içinde otomatikman Equals(),GetHashCode(),GetType() ve ToString() metodlarını görürüz.Halbuki biz bu metodları sınıfımıza yazmamıştık.Bu metodlar Object sınıfından kalıtım yoluyla gelirler.Her nesneden ulaşılabilen bu metodlar aslında object sınıfının metodlarıdır.

Bir sınıf sadece tek bir sınıftan kalıtım alabilir.Aynı anda birden fazla sınıftan kalıtım alamaz.

5 çeşit Inheritance dan söz edilebilir.

Single Inheritance (Tekli Kalıtım): Alt sınıf tek bir üst sınıfın tüm özelliklerini taşır.
Multiple Inheritance (Çoklu Kalıtım): Bir alt sınıf birden fazla üst sınıfın tüm özelliklerini taşır.
Multilevel Inheritance (Çok Seviyeli Kalıtım): Bir sınıfın alt sınıfı oluşturulduktan sonra bu alt sınfın da bir alt sınıfının oluşturulmasına denir.
Hierarchical Inheritance (Hiyerarşik Kalıtım): Bir üst sınıfın birden fazla alt sınıfa base class (temel sınıf)’lik yapmasına denir.
Hybrid Inheritance (Melez Kalıtım): Öbür Inheritance türlerinin 2 veya daha fazlasını barındıran Inheritance türüdür.

4.Basamak : Polymorphism (Çok Biçimlilik)

Polimorfizm, “bir isim birçok form” anlamına gelen Yunanca bir kelimedir. Başka bir deyişle, bir nesnenin birçok biçimi vardır veya birden çok işleve sahiptir fakat aynı isimle anılır.“Poli” çok, “morf” ise biçim anlamına gelir. Polimorfizm, bir sınıfa aynı ada sahip birden çok uygulamaya sahip olma yeteneği sağlar.Nesne Yönelimli Programlamanın temel ilkelerinden biridir.

C#’da iki tür polimorfizm vardır:

Statik / Derleme Zamanı Polimorfizmi
Dinamik / Çalışma Zamanı Polimorfizmi

♦ Statik veya Derleme Zamanı Polimorfizmi
Early Binding olarak da bilinir. Method overloading(Metot aşırı yüklemesi), Statik Polimorfizmin bir örneğidir. Aşırı yüklemede, yöntem/fonksiyon aynı ada ancak farklı imzalara sahiptir. Derleme zamanında hangi yöntemin çağrılacağına karar verildiği için Derleme Zamanı Polimorfizmi olarak da bilinir. Aşırı yükleme(overloading), yöntem adlarının farklı bir parametre kümesiyle aynı olduğu kavramdır.

Burada C# derleyicisi geçen parametre sayısını ve parametrenin tipini kontrol eder ve hangi metodun çağrılacağına karar verir ve eşleşen metot bulunamazsa hata verir.

♦Dinamik / Çalışma Zamanı Polimorfizmi
Dinamik/çalışma zamanı polimorfizmi, late binding olarak da bilinir. Burada, yöntem adı ve yöntem imzası (parametre sayısı ve parametre türü aynı olmalıdır ve farklı bir uygulamaya sahip olabilir). Method overriding(Yöntem geçersiz kılma), dinamik polimorfizmin bir örneğidir.

Yöntem geçersiz kılma, kalıtım kullanılarak yapılabilir. Yöntem geçersiz kılma ile, temel sınıf ve türetilmiş sınıfın aynı yöntem adına ve aynı şeye sahip olması mümkündür. Derleyici, işlevselliği geçersiz kılmak için kullanılabilen yöntemin farkında olmaz, bu nedenle derleyici derleme zamanında bir hata vermez. Derleyici, çalışma zamanında hangi yöntemin çağrılacağına karar verir ve herhangi bir yöntem bulunamazsa hata verir.

Son olarak, overriding methodları, temel sınıf metotlarında tanımlanan sanal veya soyut metotla aynı ada ve imzaya (parametre sayısı ve tür) sahip olmalıdır ve türetilmiş sınıfta geçersiz kılınmalıdır.

Temel sınıfın bir yöntemi veya işlevi, “overriding” anahtar sözcüğü kullanılmadan alt (türetilmiş) sınıf tarafından kullanılabilir. Derleyici, temel sınıfın işlevini veya yöntemini gizler. Bu kavram, gölgeleme veya yöntem gizleme(shadowing or method hiding) olarak bilinir.

Özetle :

Polimorfizmin anlamı, birden fazla forma sahip bir isimdir.
Polimorfizmin iki türü vardır:
Statik veya derleme zamanı polimorfizmi (örneğin, Method Overloading ve Operator Overloading).
Dinamik veya çalışma zamanı polimorfizmi (örneğin, Overriding).
Overriding, Shadowingden farklıdır.
“New” anahtar sözcüğünü kullanarak temel sınıf üyesini gizleyebiliriz.
Türetilmiş bir sınıfın sanal üyeleri geçersiz kılmasını önleyebiliriz.
Türetilmiş sınıftan bir temel sınıf sanal üyesine erişebiliriz.

5.Basamak : Abstraction (Soyutlama)

Karmaşıklığı yönetmek için kullanılır. Nesnenin diğer tüm nesne türlerinden ayıran temel özelliklerini belirtir, böylece izleyicinin bakış açısından açıkça tanımlanmış bir kavramsal sınır sağlar. Nesne yönelimli programlamada, ayırma, ayrıntıları tanımlamaktan ziyade sınıflar veya yöntemler için temel görevleri tanımlamak anlamına gelir.

Soyutlaştırma ile uygulama ayrıntıları gizlenir ve kullanıcıya yalnızca önemli bilgiler gösterilir. İç detaylar gizlenir. Örneğin, bir grup insan düşünelim. Bu insanların isimlerinin, yaşlarının, boylarının olduğu bir veri havuzu olsun. İnsanların sadece yaşlarına ihtiyacımız varsa soyutlaştırma ile yaşları dışındaki bilgiler bizden gizlenir.

Abstract Class Nedir ?

Abstract sınıflar sınıf hiyerarşisinde genellikle base class (temel sınıf) tanımlamak için kullanılan ve soyutlama yeteneği kazandıran sınıflardır. Bir sınıfı abstract yapmak için abstract keywordünü kullanırız. Abstract sınıflar en az bir tane abstract metod bulundurmalıdır.

Abstract sınıfları genel olarak inheritance (kalıtım) uygularken kullanırız.

new anahtar sözcüğü ile nesneleri oluşturulamaz.

İçerisinde değişken ve metod bulundurabilir.

Abstract sınıflardan türetilen sınıfların abstract metodları implement etmesi zorunludur. Diğer metodları override etmeden de kullanabilir.

Constructors (yapıcı metodlar) ve destructors (yıkıcı metodlar) bulundurabilirler.

Static tanımlanamazlar. ( Tanımlanmaya çalışılırsa compiler “an abstract class cannot be sealed or static” hatası verir)

Bir sınıf yalnızca bir abstract sınıfı inheritance yoluyla implement edebilir. Çoklu kalıtım (multiple inheritance) desteklenmez.

Abstract olmayan metodları da bulundurabilir.

Kendisinden inherit alacak sınıflar ile arasında “is-a” ilişkisi vardır. (Burası ilk başlarda çok önemsenmeyen ancak hangi senaryoda Abstract hangi senaryoda Interface kullanacağımızı netleştirmede bize oldukça yardımcı olan bir detaydır, hemen aşağıda açıklamasını bulabilirsiniz)

(NOT: is — a ilişkisinden daha sonra farklı bir yazıda bahsedilecektir.)

Interface Nedir?

Interface, içerisinde sadece kendisinden türeyecek olan sınıfların içini dolduracağı metod tanımlarının bulunduğu ve soyutlama yapmamıza olanak sağlayan bir yapıdır. Interface’leri tanımlarken interface keywordünü kullanırız. Tanımladığımız yapının interface olduğunu belirtmek için isminin önüne I harfini getirmek bir best-practice olacaktır. Böylece kodlama yaparken inherit aldığımız yapının bir class mı yoksa interface mi olduğunu kolaylıkla ayırt edebiliriz.

Interface hakkında internette bir arama yaptığınızda genellikle kendisini inherit alan sınıflar için bir kontrat olduğundan bahsedilir. Kontrat kelimesiyle anlatılmak istenen tam olarak budur. Türeyen sınıflar, interface’in içerisinde yer alan tüm metodları implement edeceğine dair bir söz vermekte, sözleşme yapmaktadır. Aksi halde derleyici hata verecek, kodunuz çalışmayacaktır.

Genel olarak Interface’lerin özelliklerinden bahsetmemiz gerekirse;

new keywordü ile nesneleri oluşturulamaz.

Bir sınıfın ne yapması gerektiğini belirtir, nasıl yapması gerektiğini değil.

Default olarak tüm Interface üyeleri abstract ve public olarak tanımlanır. Sizin özellikle belirtmeniz gerekmez.

Bir sınıf birden fazla interface’i inherit edebilir, çoklu kalıtım (multiple-inheritance) desteklenir.

İçerisinde yalnızca metodların imzaları yer alır, içi dolu metod bulunduramazlar.

Kendisinden inherit alacak sınıflar ile arasında “can-do” ilişkisi vardır.

(NOT: can-do ilişkisinden daha sonra farklı bir yazıda bahsedilecektir.)

Abstract Classlar ile Interfaceler Arasındaki Farklar

6.Basamak : Encapsulation

Kapsülleme (Encapsulation) kavramı bir nesnenin bazı özellik ve işlevlerini başka sınıflardan ve nesnelerden saklamaktır. Private erişim belirteci sayesinde bu şekilde tanımlanan bir field’ i başka sınıflardan gizlemiş oluruz. Ayrıca bu field başka sınıflarda kullanılamaz.

Kapsülleme (Encapsulation) sayesinde nesneler bilinçsiz kullanımdan korunmuş olur. Fakat bazı durumlarda private field’ lara erişmemiz ve özelliklerini kullanmamız gerekebilir. Bu durumda Property kavramı devreye girer. Property bir field’ in değerini geri döndürmeye (Get) ve değerini ayarlamaya (Set) olanak sağlar.

Şeniz fullmoonborn of the House Akbulut, first of her name.The Princess of Her Father, Diva Queen of her mother , breaker of hearth , mother of Fadıls.

Şeniz fullmoonborn of the House Akbulut, first of her name.The Princess of Her Father, Diva Queen of her mother , breaker of hearth , mother of Fadıls.