JAVA Programlama

Polimorfizm(Çok Biçimlilik)

image_pdfimage_print

Polimorfizm, nesneye yönelik programlamanın önemli kavramlarından biridir ve sözlük anlamı olarak “bir çok şekil” anlamına gelmektedir. Polimorfizm ile kalıtım konusu iç içedir.

 

Polimorfizm ile bir nesne farklı sınıflardan oluşturulan nesneler gibi davranabilir.

Basit bir örnekle anlatayım.

Polimorfizm sınıfında Goster(Kus k) yordamını oluşturalım. Kus sınıf tipindeki değişkene  Goster(p); ve Goster(k2);  ile Papagan ve Kugu tipindeki referanslar bağlandı. Papagan ve Kugu tipindeki nesnelerle çağrılması yukarı çevrim dir (upcasting). Upcasting ne olduğunu önceki yazılarımda anlatmıştım. Papagan ve Kugu tipindeki nesnelerin Kus tipinde davranması polimorfizmdir.

 

Polimorfizm’in oluşması için birkaç kurala uyulması gerekir

Bunlar;

• cokBicimlilik() metodu parametresi kesinlikle en üst sınıfın nesnesi olmalıdır.

• Polimorfizm aşamasında kullanılacak metodlar ana sınıf içerisinde tanımlanmış olmalıdırlar.

 

Geç Bağlama (Late Bındıng) ve Erken Bağlama (Early Binding) 

Çok biçimlilik kavramını oluşturan bir diğer kavram ise, geç bağlama (late binding) kavramıdır. Geç bağlama; bir nesnenin hangi nesneye ait olduğunu ve hangi nesneye bağlandığını, çalışma zamanında belli olmasına denir. Eğer herhangi bir referans oluşturur ve bu referansın herhangi bir öğesine ulaşmak istersek, bu derleme zamanında belli olan şeydir.

Ancak çok biçimlilik işleyişinde görülen şu ki; ulaşmak istenen öğenin hangi nesneye ait olduğu derleme zamanında belli değildir. Bu belirsizliğin derleme zamanında tespit edilmesi olanaksızdır. Çünkü kendisine gelecek referansın hangi nesneye ait olacağı bilinmemektedir. Ancak çalışma zamanında kendisine gönderilecek referansla belirlenecektir. Dolayısıyla bu belirsizlik, geç bağlamayı besleyen ana maddedir.
Daha açık şekilde ifade etmek gerekirse; çalışma sırasında nesne örneğinin bağlanacağı nesne türünün belirlenmesine, geç bağlama denir. Yani nesne örneği üzerinde bir inceleme başlatılacak ve hangi referansa ait olduğu tespit edilip bağlantı işlemi gerçekleştirilecek.
Tüm bu uğraşlar çalışma zamanında yapılacağı için dolayısıyla performans kaybı yaşanacaktır. Performans kaybı sonucunda oluşan gecikme, geç bağlantı sağladığından dolayı geç bağlama ismi verilmiştir.

Yukarıdaki metodun bize görünen kısmı bu şekildedir. Ancak geç bağlama kavramını detaylandırabilmemiz için, metodun arka planına birazcık değinmemiz gerekir. Az önceki metodu, geç bağlamayı yansıtacak şekilde aşağıda verilmiştir.

Yukarıda verilen her iki metod arasındaki farklar rahatlıkla görülmekte. İkinci örnekteki metodu incelersek;parametre olarak tanımlanan değişken Object tipindedir. Ana program tarafından gönderilen BenimInteger sınıfı referansı, metod içerisine kadar Object tipinde gelmekte. Daha sonra bir dönüştürme işlemine tabii tutulup asıl referans elde ediliyor. Bu işlemler müteakiben ilgili metod erişimi sağlanıyor. Yani bağlanma gerçekleşiyor.

Fınal Deyimi ve Geç Bağlama 

Fınal anahtar kelimesini kullanmamızın asıl iki nedeni vardı. Birincisi performans, ikincisi ise tasarım idi. Geç bağlama kavramında bizi ilgilendiren şey tasarımdır. final anahtar kelimesinin bu konu üzerindeki etkisi, tersi bir etkidir.

Yani final olarak tanımlayacağımız bir sınıfın kalıtım alınamayacağı, ayrıca metod üzerinde kullanımında ise iptal (override) edilemeyeceğidir. Dolayısıyla kalıtımın engellenmesi, tüm metodlar üzerinde geç bağlama durumunun ortadan kalkacağı anlamına gelir. Ayrıca iptal (override)’in engellemesi, ilgili metod üzerinde geç bağlamanın yapılamayacağı anlamına gelir. Her iki durumda geç bağlama ortadan kalkar. Ancak metodlar üzerindeki etkisi; sadece ilgili metod iptal (override) edilemeyeceği için geç bağlama, sadece bu metod üzerinden gerçekleşmez.

Yukarı Çevirim (UpCastıng) 

Yukarı çevirim; gelişmiş özellikli bir tipten daha genel bir tipe doğru çevirim durumunda meydana gelir. Tüm sınıfların Object sınıfından kalıtım aldığını göz önünde bulundurursak, sınıfların Object tipine çevrilmesi yukarı çevirimdir. Bu durumu daha detaylı ifade edebilmek için iki sınıf geliştireceğiz. İlk sınıf genel bir tip konumunda olacak. İkinci sınıfımız ise ilk sınıftan kalıtım alacak ve daha gelişmiş özellikler eklenecektir.

Aşağı Çevirim (Down Castıng) 

Yukarı çevirimin tam tersi ise aşağı çevirimdir. Aşağı çevirim; genel bir tipten daha gelişmiş özellikli bir tipe çevirim durumuna denir.

Instanceof Anahtar Kelimesi 

Çok biçimlilik kullanımı zorunlu değildir. Çok biçimliliğin olmadığı yerde aşağı çevirim söz konusudur. Ancak aşağı çevirim durumunu kontrol etmemiz için esnek bir yapıya ihtiyacımız var. Aksi halde aynı metod içerisinde birden fazla tip kontrolü yapmamız pek de kolay olmayacaktı. Java’da bir nesnenin hangi sınıfa ait olduğunu sınamak için instanceof anahtar kelimesi kullanılır. Bir if bloğu ile bu anahtar kelimesini kullanarak tip kontrolleri yapabilirsiniz.

Yukarıdaki uygulamada üç adet sınıf tanımlanmıştır. Ana program içerisinde bu sınıflardan birer nesne üretilmiş ve instanceof anahtar kelimesiyle hangi sınıfa ait nesne olduğu kontrol edilmektedir.

Kaynakça:

Java Polimorfizm (Çok Biçimlilik)

http://www.cemkefeli.com/post/2009/09/16/JAVA-Polimorfizm(Cok-bicimlilik)-nedir.aspx

Java 8 Standart Edition

Hazırlayan:Yağız Can Dinç

4
1

Bir cevap yazın

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