"Enter"a basıp içeriğe geçin

İç İçe Sınıflar ve Kalıtım

 

Sınıf İçinde Sınıf Kullanma

Bir sınıfın içinde başka sınıflar kullanmak, programımızı gerçek hayata benzetmede işimizi kolaylaştırır.

Sınıf içinde sınıf kullanmaya örnek olarak bir kod yazalım.
Bu kod, koordinat sistemi üzerinde geometrik şekilleri gösterebiliyor.

Bunun için öncelikle nokta adında bir sınıf oluşturmalıyız. Her bir noktanın x ve y olmak üzere değerleri var. Ayrıca noktalarla ilgili bazı fonksiyonlar da ekleyeceğiz.
Daha sonra üçgen ve dörtgen adında 2 sınıf daha oluşturalım. Üçgen, noktalara sahiptir. Aynı şekilde dörtgende de noktalar vardır. Yani nokta sınıfının nesnelerini hem üçgen hem dörtgen için kullanılabilmemiz gerekir.

Nokta sınıfının nesnelerini aynı bir int veya string değişken tanımlar gibi sınıfımızın içinde değişken olarak kullanabiliriz. Nokrta nesneleri koordinat sisteminde bir noktayı gösterirler. Bu noktalar birleşerek de üçgen veya dörtgen oluştururlar.

Kodumuzu yazalım

Nokta sınıfı:

Üçgen sınıfı:

 

Dörtgen sınıfı:

 

Main sınıf

Üçgen ve dörtgen sınnıflarının içinde nokta nesneleri kullanarak üçgen ve dörtgenler oluşturduk.

Üçgen ve dörtgen sınıfları nerdeyse birbirinin aynısı dediğinizi duyar gibiyim. E o zaman bu kadar kod tekrarına gerçekten gerek var mı? Tabi ki yok.
Bu tarz durumlar, OOP’nin en önemli konularından biri olan kalıtıma giriyor.

Kalıtım

Üçgen ve Dörtgen gibi şekillerimiz var. İki sınıfın ortak özellikler var. İkisi de noktalardan oluşuyor. Kenarları var. Çevre uzunlukları var. Zaten iki sınıf da geometrik şekil olduğundan bu durum normal. Ancak birbirlerinden ayrıldıkları yönleri de var.

Bu kadar benzerlik varken kod tekrarı kaçınılmaz. Bir de beşgen veya eşkenar üçgen sınıfı eklemek isteyelim. Kod tekrarları daha da artar. Bu şekilde sonsuz tane geometrik şekil olabilir.
Kopyala yapıştır yapmak bir çözüm gibi görünebilir. Ama aslında karmaşayı daha da arttırır. Olası bir hatada her sınıf için düzeltmeler yapmamız gerekir. Veya renk gibi bir özellik eklememiz gerekti. Yine tek tek tüm sınıfları dolaşırız. Sınıf sayısı arttıkça bu karmaşa artar.

Kalıtım olmadan hayatın ne kadar zor olduğunu anladıysanız, artık kalıtıma geçebiliriz.

Kalıtım mekanizması tüm bunları aşmamızı sağlar.
Bu saydıklarımızın hepsi bir şekil ise, şekil diye genel bir sınıf oluşturalım. Ortak özelliklerin hepsini bu sınıfa ekleyelim (köşe sayısı, alan, çevre vb),
Ortak özellikler her sınıfa aynı şekilde geçer. Daha sonra diğer sınıflarla ortak olmayan özellikleri ekleriz. Örneğin dörtgende 3 değil 4 nokta bulunur. Bu 4. nokta ek bir özelliktir. Veya eşkenar üçgende kenarların aynı uzunlukta olduğu kontrol edilmelidir.

Ortak özellikler alt sınıflara otomatik geçtiğinden ana sınıfta(şekil) yapılan değişiklikler tüm alt sınıfları etkiler. Ortak özellikleri sadece 1 kere yazarak yüzlerce alt sınıf üretebiliriz.
Sonuç olarak kalıtım olmazsa olmaz değildir. Ama kalıtımı kullanarak çok daha hatasız kodları daha hızlı şekilde yazabiliriz.

Diğer sınıfların özelliklerini aldığı sınıfa base class denir. Base class’taki herşey otomatik olarak onun alt classlarına (subclass) geçer.

Bu kadar teorik bilgi yeter. Biraz kod yazalım:

Nokta sınıfı aynen kalıyor

 

Üçgen, dörtgen ve ikizkenar üçgende olan temel özellikler için bir şekil sınıfı yazdık

Bir geometrik şekil en az 3 noktadan oluşmalıdır. Bu yüzden Base class’a ilk 3 nokta ile ilgili şeyleri ekleyebiliriz. Aynı şey orjin için de geçerlidir.
Base class için constructor olmak zorundandır. a,b ve c noktası için getter-setter’lar da base class’a eklendi.

 

Üçgen sınıfına geçelim.

Alt sınıfların yapıcı metodları olmalıdır. İçinde üst sınıfın constructor’u kullanılabilir. Bunun için super anahtar kelimesi kullanılır. this dediğimizde nesnenin kendini kastediyordu. super ise Base class’ı temsil eder.
Yani diyor ki, sen ortak özellikleri ilklendirmek için base class’ın constructor’unu kullan, ekstra özellikleri ben eklerim.
Alt sınıfın bir nesnesini oluşturmak istediğimizde önce alt sınıfın yapıcısı çağırılır. O da base class’ın yapıcısını çağırır. Base class yapıcısı ortak özelliklere ilk değerlerini verir. Sonra alt sınıfın yapıcısı kalan özellikleri ekler.

a,b,c noktaları, bunların getter-setterları ve orjin noktası olduğu gibi üçgen sınıfına geçtiği için üçgen sınıfına kopyalandığı için tekrar yazmamıza gerek kalmadı.
setşekil fonksiyonu da aynen üçgen sınıfına geçti.
Bunu şöyle de düşünebiliriz. Şekil sınıfının bloğunu ctrl+c ile kopyalayıp ctrl+v ile Üçgen sınıfına yapıştırıyoruz.

Bazen üst sınıftaki fonksiyon ihtiyacımızı karşılamayabilir. Bunlar yeniden yazılmalıdır.
Base class’ta olan bir metod alt sınıfta tekrar tanımlanırsa alt sınıf için yazılan çağırılır.(override)
Override edilen metodun imzasının üst sınıfla aynı olması gerekir. Yoksa overloading olur.
Başına @Override diyerek hatırlatıcı koyabiliriz.

İkizkenar üçgen de bir üçgen olduğundan, İkizkenar üçgen de kalıtım ile üçgen sınıfından özelliklerini alabilir.

Üçgen sınıfında olmayan özellikleri yine kendimiz ekledik. Ama bunun dışında üçgen sınıfındaki tüm fonksiyonlar ikizkenar üçgen sınıfına otomatik geldi.
Üçgen sınıfı da zaten özelliklerinin bir kısmını şekil sınıfından aldığı için şekil sınıfındaki her şey ikizkenar üçgen sınıfına da geçti.

Sıra geldi dörtgen sınıfına
Şekil ve üçgen sınıflarının aksine dörtgen sınıfında fazladan bir nokta var. Bu yüzden bu fazladan noktayı da düşünmeliyiz.

Kalıtım ile ilgili nerdeyse tüm özellikleri böylece kullandık. Üst sınıftan gelen fonksiyonları aynen kullanabileceğimiz gibi tekrardan yazabileceğimizi (override) gördük.
Ayrıca kodları yeniden yazarken üst sınıftaki fonksionu da kullandık. Kalıtımla oluşmuş bir koddan tekrar kalıtımla başka bir sınıf ürettik. Ve tüm bu sınıflarda nokta sınıfını da kullandık. Böylece kodumuzu çok daha kısa bir hale geirmiş olduk.
Şimdi main sınıfı kullanarak deneyelim. Bakalım neler olacak.

İstediğimize ulaşmış olduk

Koddaki kısalmayı sınıf sayısı arttıkça ve ağaçta aşağıya indikçe daha fazla hissedeceğiz.

 

Polyorphism

Ana sınıfın referansı ile alt sınıf nesneleri tutabiliriz. Ama sadece ana sınıfta imzası olan üyeleri kullanabiliriz. Eğer üye override edilmişse subclass’taki üye kullanılır. Edilmemişse ana sınıftaki kullanılır.

Fonksiyonlara da Base class referansı ile yollanabilir.

 

Tutulan nesnenin türünü anlamak için instance anahtar kelimesi kullanılır.

true false veya switch ile kullanılır. İkizkenar üçgen hem üçgen hem de İkizkenar üçgendir. Aynı zamanda hepsi birer şekildir.

Not:

Eğer bir metod final olarak tanımlanırsa, kalıtım ile override edilemez.

Final sınıflardan kalıtım yapılamaz.

    Bir cevap yazın

    E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir