惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
Engineering at Meta
Engineering at Meta
月光博客
月光博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
博客园 - Franky
The GitHub Blog
The GitHub Blog
大猫的无限游戏
大猫的无限游戏
The Cloudflare Blog
B
Blog RSS Feed
云风的 BLOG
云风的 BLOG
小众软件
小众软件
罗磊的独立博客
Microsoft Azure Blog
Microsoft Azure Blog
I
InfoQ
美团技术团队
H
Hackread – Cybersecurity News, Data Breaches, AI and More
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
C
Check Point Blog
WordPress大学
WordPress大学
博客园 - 【当耐特】
博客园 - 司徒正美
D
Docker

Yusuf Aytas

When Code Is Cheap, Does Quality Still Matter? Why Crouching Tiger, Hidden Dragon Is a Masterpiece Why We Ignore Advice The Mirror Is Part of the Machine When Too Many Maps Overlap on One Person The Work Runs on Different Maps Your Work Introduces You Trial By Fire The Dude Why Headcount Math Lies Capacity Is the Roadmap The Roadmap Is Not the System Torres del Paine W Trek Escaping Status Theater Incentives Drive Everything Scaling Culture Without Dilution What Good Looks Like Why Airport Security Feels Random Why Politics Appear How to Work with Me The Janus Protocol Multi-Horizon Delivery Framework What Good Execution Looks Like Managing Your Manager Why Kingdom of Heaven’s Director’s Cut Is Better AI Broke Interviews Most of What We Call Progress Managers Have Been Vibe Coding All Along Stop Wasting Brainpower Why Over-Engineering Happens
Inheritance ve Polymorphism
Yusuf Aytas · 2009-12-06 · via Yusuf Aytas

Published · 3 min read

Polymorphism ve Inheritance beraber kullanılan iki önemli nesneye dayalı (Object-Oriented) programlama unsurudur. Bunlar program kodlarının yeniden kullanılabilmesi veya var olan kodun geliştirilebilmesi açısından çok önemlidir. Günümüzde yaygın olarak kullanılan diller de nesneye dayalı programlamaya elverişlidir. Bunlara örnek verecek olursak JAVA ve C++ başta gelen nesneye dayalı programlama dilleri olarak gösterilebilir. Örnekler Java üzerinden gidecek. Inheritance ve Polymorphism’i ayrı ayrı aşağıda tartışalım.

Inheritance

Inheritance adında da anlaşılacağı gibi kalıtım anlamına geliyor. Tabi bunun programlama dillerinde anladığımız şekli farklı. Bunu bir örnekle açıklamak istiyorum. Mesela, bir okulda bilgisayar sistemi olsun ve bu sistemin değişik kullanıcıları olsun. Bunlar lisans öğrencileri, akademisyenler,yüksek lisans öğrencileri, asistanlar ve benzeri kişiler olduğunu varsayalım. Şimdi bu insanların hepsi sistemin kullanıcısı. Biz buna karşılık olarak User(Kullanıcı) adında bir sınıf(class) yaratalım. Şimdi bu sınıf bizim ata sınıfımız olacaktır. Amaç ortak alanları tek yerde toplamak. Bununda türevlerini şu şekilde oluşturabiliriz. Mezun olmamış öğrenciler ve yüksek lisans öğrencilerini bir sınıfa toplayacak olursak bunlara genel olarak öğrenci(Student) diyebiliriz. Çünkü ortak olarak öğrenci paydasında buluşuyorlar. Öğrencileri de yüksek lisans(Master) ve lisans öğrencisi(Undergraduate) olarak ayrı iki sınıfta toplayalım. Akademisyenler(Professor) de sistemin kullanıcısı olduğunu düşünürsek onlarında atası yine User sınıfı olacaktır. Aşağıda buna ilişkin uml şeması bulunmaktadır.

Kalıtım ve çok biçimlilik şemasıKalıtım ve çok biçimlilik şeması

Polymorphism

Polymorphism aslında Inheritance bağlı bir nesneye bağlı programlama unsurudur. Polymorphism çoğu zaman inheritance ile gelir, ama interface ile de sağlanabilir. Polymorphism‘in programlamadaki manasına geçmeden önce, kelime anlamına bir bakmak programlamadaki anlamını daha kolay kavramamıza yardımcı olacaktır. Poly birden fazla manasına gelmektedir. Morph ise şekil veya görüntü anlamına gelmektedir. İkisini bir araya getirirsek birden fazla görüntüsü olan olarak ifade edebiliriz.

Anlamını öğrendikten sonra programlamada nasıl kullanıldığını ve ne anlama geldiğine bakalım. Yine bunu da bir örnek ile açıklayalım. Mesela hayvan(Animal) adlı bir sınıf oluşturalım ve bunun çocukları olan Kedi (Cat) ve Köpek(Dog) adında iki tane sınıf tanımlayalım. Şimdi bu iki sınıfta da birer talk() metodu olsa ve kedi ve köpeğin çıkardığı sesleri döndürürse polymorphism’i sağlamış oluruz. Bu şu demek hayvan sınıfında olan talk() metodunu her iki sınıfta method overriding yapıyor. Bu şekilde kedi ve köpek sınıfı birbirinden farklı özelliklerde talk() metoduna sahip oluyor. Bu sadece metodlarda değil aynı zamanda Constructorlarda da geçerlidir. Aşağıda konuyla ilgili kod örnekleri vardır.

abstract public class Animal{
	//Her iki hayvan objesinde olan talk metodu.
	//Abstract sınıflarda metodu tanımlamak zorunda değiliz
	//ancak eğer metodu aşağıdaki şekilde yazarsak
	//java derleyicileri bu sınıfın çocuklarında metod yazılmassa
	//hata verecektir.
	public abstract String talk();
}
public class Cat extends Animal{
	//Kedi sınıfı kediye has olan miyavlama
	//sesini döndürüyor bu şekilde farklı
	//bir görünüme sahip oluyor.
	public String talk(){
		return "Miyav";
	}
}
public class Dog extends Animal{
	//Kedi sınıfı köpeğe has olan havlama
	//sesini döndürüyor bu şekilde farklı
	//bir görünüme sahip oluyor.
	public String talk(){
		return "Hav hav";
	}
}

Abstract ve Interface Notu

Yazımın sonuna doğru Abstract sınıfları ve Interface leri anlatacağım. Bu yazıda detayına girilmiyor, ama şunu akılda tutmak yeterli. Abstract sınıf ve Interface ler genel olarak aynı işe yarar. Ama yerine göre birbirine göre daha uygun olabilirler. Bunlar aynı proje üzerinde çalışan farklı yazılımcı gruplarının birbirlerinin metotlarını görebilmeleri için aracılık eden veya sağlayan yazılım unsurlarıdır. Sözleşme tanımlarlar.

Inheritance ve Polymorphism nesneye dayalı yazılımın temel taşlarından bir kaçıdır. Bu tür yazılımlarda geliştiricinin kodları anlaması ve yeniden kullanabilmesi için bu tür özelliklere sahip olması gerekmektedir. Ayrıca çok büyük yazılım projelerinde -bir bilgisayar oyunu gibi- projeyi parçalara ayırmanız gerekir ve bu durumda polymorphism ve inheritance kompleksliğin düşmesi açısından yani parçalanma bakımından önemli bir yer tutar. Kısacası Polymorphism ve Inheritance geliştiricinin ileride daha rahat kullanabileceği bir yazılım ortamı sağlar. Bakım maliyeti düşer, genişletmek kolaylaşır.