Inheritance Nedir?

Bu kelimeyi ilk duyduğumda eminim siz de benim gibi ne havalı kelime be! Demişsinizdir diye hissediyorum çünkü gerçekten öyle havalı.

Evet bugün konumuz “ Inheritance” yani Türkçe literatüre kalıtım olarak geçmiş nesne yönelimli programlamanın en önemli yapı bloklarından birisi. Programlarımızı kodlarken biz yazılımcılara bir çok yerde avantaj ve sürdürülebilirlik sağlayan bir kavram. Benim gibi henüz junior seviyede ki bir geliştiriciden bu konuyu ne kadar dinlemek istersiniz orasını bilmiyorum ama bu konuyu iyi derece search ettiğimi söylemek istiyorum. Mutlaka atladıklarım veya duymadığım tarafları olabilir elbette ama elimden geldiği kadar “Nesne yönelimli programlamaya” “Base class(super class)”, “Drived class(child class)” kavramlarına hatta ve hatta “Sealed” anahtar kelimesine bu yazdım da yer vermeye çalışacağım. O yüzden şimdiden söyleyebilirim ki uzun bir yazı olacak. Elimden geldiği kadar görsel örneklerle hem konuyu meraklısına hem de kendime anlatıyor olacağım. Haydi gelin lafı çok uzatmadan başlayalım efenim.

Öncelikle bir programcı olarak, junior seviyede ki bir programcı olarak daha doğrusu bu konunun mutlaka anlaşılması gerektiğini düşünüyorum. Çünkü dilde ki diğer yapıları anlamamız için “Inheritance” adeta bir mihenk taşı gibi. Nedir bu diğer kavramlar diye soracak olursanız. Interface, Abstract Class, Virtual Methodlar gibi örnekler verebiliriz. Kısaca eğer yazılım hayatımızda ilerlemek istiyorsak bu konuyu mutlaka anlamamız ve kafamızda bitirmemiz gerektiğine inanıyorum.

Bu yazımda C# dilinden örnekler vereceğim. C# dilinin %100 nesne yönelimli bir dil olduğunu düşünürsek aslında bu konun daha fazla önem arz ettiğini söylememe gerek yok herhalde. Peki nedir bu nesne yönelimli programlama neden önemli? Nesne yönelimi programlamaya derinlemesine dalmadan sadece neden önemli olduğuna değineceğim belki bu konuyu başka bir yazımda ele alırım.

Nesne Yönelimli Programlama Niçin Önemli?

Bunu anlamamız için tarihte ufak bir geriye gidip bu konu hakkında daha fazla kaynak bulabilir miyim diye araştırmaya koyuldum. En sonunda topladığım bilgilerden özümsediğim kadarıyla ufak bir tarih yolculuğuna başlayalım istiyorum. 1960'lı yıllarda günümüze nazaran çok daha ufak uygulamalar geliştiriliyordu. Kullanılan diller ise günümüzde çok fazla ismi duyulmamış olan ve çok da popüler olmayan dillerdi. Assembly, Fortran ve Cobol gibi bu diller hakkında çok derin bir araştırmaya girmediğimi söylemek istiyorum. Matematiksel hesaplamalar için kullanıldığını söyleyebilirim bu tarz dillerin dileyenler detaylı araştırabilirler. Konumuzdan çok sapmadan devam edelim. Bu tarz diller kendi alanlarında başarılı olsalar da günümüz teknolojisinin gelişmesi ile artık isteklere cevap verememeye başladılar. Tam bu noktada bütün dillerin atası olarak bilinen C dili hayatımıza giriyor. C dili güçlü bir dil olmasına rağmen özellikle internetin yaygınlaşması programlarımızın eskisine göre yalın olmaması ve bir çok hizmet verecek şekilde tasarlanmış olması gerekliliği C dilini de ihtiyaçlara hızlı bir şekilde cevap veremez durumda bırakmıştır. Bu durum C dilinin kötü olduğu anlamına kesinlikle gelmez. Sadece günümüz teknolojisinin değişiminin bunda çok önemli bir payı olduğunu söyleyebiliriz. Bu noktada günümüzde de bir çok alanda kullanılan C++ dili karşımıza çıkıyor. C++ , C dilinde olduğu gibi yapısal programlamaya destek veriyor hem de çağın tekniği olan nesne yönelimli programlama tekniğine oldukça destek sağlıyordu. C++ sırasıyla JAVA ve C# dilleri izlemiştir. Bu pekte kısa olmayan tarih dersimizden sonra aslında nesne yönelimli programlanın günümüz ihtiyaçları için ortaya çıktığını söyleyebiliriz belki de şuan ki iş ihtiyaçlarımız hala eskisi gibi olsaydı JAVA ve C# gibi dilleri hiç duymayacaktık bile kim bilir. Konunun can alıcı noktalarına biraz daha değinmek gerekirse Nesne yönelimli programlama günümüz hayatı simüle edecek yöntemler topluluğudur. Her Classın veya Türkçesiyle Nesnenin kendine has özellikleri vardır. Nesneler kendileri aralarına haberleşebilirler. Hiyerarşik yapıda olabilecekleri gibi tamamen birbirlerinden bağımsızda hareket edebilirler. Önemli olan her nesnenin işini sağlıklı bir şekilde yapmasıdır. Bu noktada aslında “SOLID” gibi kavramlara denk geliyoruz diyebilirim. Evet nesne yönelimli programlamanın neden önemli olduğunu elimden geldiğinde açıklamaya çalıştığımı söyleyebilirim dediğim gibi derin bir konu ve bu yazının amacı “Inheritance” olduğu için bu kadar bilgi vermemizin yeterli olduğu kanaatindeyim :)

Gelelim Konumuza Inheritance Nedir?

Kısaca açıklamak gerekirse Inheritance için nesne yönelimli programlamanın mihenk taşı olduğunu söylemiştik. Inheritance sayesinde programımızda ki Classların farklı oluşturduğumuz Classlarımıza özelliklerini aktarmasını ve böylece hiyerarşik bir düzenleme yapmamızı sağlar. Ayrıca aynı Classlar’dan Inherit ettiğimiz nesnelerin benzer özelliklerini her yerde yazmaktansa bir üst sınıfta tanımlanmasını ve her Classın bu özellikleri bir üst sınıftan Inheritance yoluyla kalıtım alınmasını sağlamaktadır. Bu durum gereksiz bir sürü kod yazmamızı engellemekte ve ayrıca mimarisel tasarım açısından biz programcılara bir çok avantaj sağlamaktadır. Biliyorum bu tanımlamaları ilk duyduğumda ben de “O ne ya” diye bir cümle kurmuştum hala da %100 anladığımı tabi ki söylemem. Fakat daha aydınlatıcı olması açısından gelin bir kaç örnek yaparak bu konuyu daha net bir biçimde açıklamaya çalışalım.

Dip Not: C# Dilinde Inheritance syntax açısından “ : ” ile yapılırken Java dilinde ise “extends” yazılmaktadır.

Bu Örneğimizde Inheritancesı en basit haliyle göstermemiz gerekirse Human olarak bir sınıf tanımladık Bu sınıfımız bizim için Man ve Women olarak tanımladığımız sınıfların ortak özelliklerini barındırabilir. Man ve Women Sınıflarının farklı özellikleri de olabilir kendi içlerinde. Bu teknik bizi programlarımızda gereksiz kod yazmamızdan kurtaracak performans açısından daha kaliteli mimariler inşa etmemizi sağlayacak ve en önemlisi “DRY” yani kendini tekrar etme prensibini çiğnememizi engelleyecektir.

captionless image

Base Class ve Derived Class Tanımları

Base Class literatüre Super Class olarak da geçmiştir peki nedir bu Base Class? Adı üstüne Base yani ana olarak tanımlayabiliriz. Örneğimizin üstünden gidecek olursak Human olarak tanımladığımız Classımız Base yani ana Classımızdır. Derived Classlarımız ise bu örnekte görüldüğü gibi Man ve Woman Classlarıdır. Yani Child Class olarak da isimlendirebiliriz.

Bir nesnenin sadece bir Base Classı olabilir birden fazla Base Classa sahip olamaz. Bunu kaba bir örnekle tanımlayacak olursak. Benim Base Classım babamdır gibi bir örnek verebiliriz daha net olması açısından :) Fakat bir Classın birden fazla Derived yani Child Classı olabilir. Yani benim bir tane babam olabilir fakat babamın bir den çok çocuğu olabilir gibi bir örnekle daha net anlaşılmasını sağlayabiliriz. Kısaca kalıtımın günlük hayatımızın aslında ne kadar içinde olduğunu bu örnekten de kolayca yakalayabiliyoruz. Bu teknik Nesne yönelimli programlanın temel taşıdır. Eğer bu şekilde bir tekniğe izin vermemiş olsaydı gerçekten hiç bir anlamı olmazdı. Örneğimizi biraz daha geliştirirsek.

Human olarak tanımladığımız Base Classımıza “HelloWorld” isimli bir Method yazdık bu Method aracılığıyla ekrana “Human Work” isimli bir mesaj yazdırmak istiyoruz. Fakat bu işlemi gerçekleştirirken Human Classını değil de bizim Derived Classlarımız’dan biri olan Man Classını kullanıyoruz. Gördüğünüz gibi Man Classı da Human Classı’nın özelliklerini ve Methodlarını kullanabilir hale geldi programı bu şekilde çalıştırdığımızda ekrana “Human Work” yazdığını göreceğiz. Burada çok basit bir Inheritance yapmış olduk.

captionless image

Peki “Man” nesnemizin kendi özellikleri olamaz mıydı tabi ki olabilirdi. Bunun için “Man” nesnemize yeni bir Method daha yazıyoruz. Methodumuzun ismi “HelloMedium” olsun ve bizim için ekrana “Hello Medium” ifadelerini yazsın.

captionless image

Gördüğünüz gibi Man nesnemizin de artık kendine has bir özelliği var. Bu örnekten çıkıp artık yeni bir kaç örnek verelim istiyorum konuyu daha iyi anlamamız açısından. Öncelikle “Employee” diye bir Class oluşturuyoruz ve bu nesnemizin içinde “FirstName” ve “LastName” olarak 2 tane property tanımlıyoruz. Employee bizim Base nesnemiz. Daha sonra “Worker” ve “OfficeMan” adında 2 Class daha oluşturuyorum. Programımın main Methoduma geldiğimde artık Bu 3 nesneme de gerekli değerleri atayabilirim. İsim ve Soyadı şeklinde yaptığımız için gerekli yerleri atıyorum ve bir adet “Foreach” döngüsü ile sonuçları ekrana yazdırdığımda ise görüyoruz ki bizim Employee nesnemizin taşıdığı özellikleri diğer nesnelerimiz de alabiliyor böylece diğer nesnelerimize de “FirstName” ve “LastName” değerlerimizi atamış olduk. Örneğimizde gördüğünüz gibi bu programımızı başlattığımızda sırasıyla isimlerin Konsola yazdığını göreceksiniz. Örnekleri çeşitlendirebilirsiniz.

captionless image

Son olarak Sealed anahtar sözcüğü nedir?

Sealed anahtar sözcüğünü de ufaktan bir anlatacak olursak. Günümüzde çok fazla kullanımına denk geldiğimizi söylemeyiz. Ancak bir kaç kaynakta gördüğüm ve nedir bu Sealed diye araştırmaya koyulduğum bir anahtar kelime. Sealed Class kısaca bazı durumlarda programcılar olarak oluşturduğumuz nesnelerimizin türetilmesine engel olmak için bu anahtar kelimeyi kullanıyoruz. Peki neden böyle bir şey yapma ihtiyacı duyuyoruz ?Birincisi ilgili sınıftan türetme yapmanın gerçekten anlamsız olması. İkinci olarak ise güvenlik sorunları olabilir. Örnek vermek gerekirse her hangi bir iş yapan sınıfımız programcılara sunulduğunda. Nesnenin var olan özelliklerine ek özellikler eklenmesi diğer Nesnelerimizin hatalı çalışmasına sebep olabilir. Bu gibi senaryolarda “Sealed” anahtar kelimesinden yararlanıyoruz diyebilirim. Dediğim gibi günümüzde çok fazla kullanımına şahit olmadığım bir anahtar kelime. Fakat bu yazımda ufakta olsa yer vermek istedim açıkçası. Ufak bir örnekle konumuzu taçlandıralım.

Örneğimizde “Worker” adlı bir Class oluşturdum ve bu nesnemizi Sealed anahtar sözcüğüyle işaretledim artık “Worker” nesnemizi örnekte gördüğünüz gibi “HomeWorker” nesnemizi miras olarak alamıyor Worker nesnemizi bu şekilde mühürlemiş olduk.

captionless image

Son kısım ve kapanış

Evet yazımızın son kısmında Inheritance konusunu elimden geldiği kadar genel hatlarıyla bir junior developer gözünden aktarmaya çalıştığıma inanıyorum. Yazının başında da belirtiğimiz gibi bu konu Abstract Classlar, Virtual Methodlar gibi daha açıklanacak bir çok kavrama uzanıyor. Fakat bu konular başka bir yazının konusu olduğu için bu yazımda yer vermedim. Bunun dışında konuyu hiç bir bilmeyen birisine genel hatlarıyla anlattığımı düşünüyorum, eksiklerimiz mutlaka olmuştur. Şurası şöyle olmalıydı Tarık dediğiniz konuları lütfen bana mail yoluyla iletin efenim bir sonra ki yazılarımda görüşmek dileğiyle

Contact: Ledunv@protonmail.com