Kalıtım ve Polimorfizm Özellikleri İçeren C# Dilinde Örnek Kodlama Yapıları

Kalıtım ve Polimorfizm Özellikleri İçeren C# Dilinde Örnek Kodlama Yapıları

C# dilinde kalıtım ve polimorfizm özelliklerine dair örnek kodlama yapıları! Bu rehber sayesinde C# programlama dilindeki kalıtım ve polimorfizm özelliklerini öğrenebilir ve örnek kodlama yapılarını inceleyebilirsiniz Detaylı anlatımlar ve örnekler için tıklayın!

Kalıtım ve Polimorfizm Özellikleri İçeren C# Dilinde Örnek Kodlama Yapıları

Bu makale C# programlama dilinde kalıtım ve polimorfizm özelliklerinin incelenmesi ve örnek kodlama yapılarının sunulması üzerine odaklanmaktadır. Kalıtım, bir sınıfın diğer sınıflar tarafından miras alınabilen özelliklerinin ifade edilmesidir. Bu yapı, kodun tekrarlanabilirliğini azaltır ve değişikliklerin daha kolay yönetilmesine izin verir. C# dilinde kalıtımın nasıl uygulanacağı ve örnekler sunulacaktır.

Polimorfizm, bir nesnenin birden fazla şekle sahip olabilme özelliğidir. Bu yapı, aynı işlemlerin farklı şekillerde çözümlenmesini mümkün kılar ve kodun daha esnek hale gelmesini sağlar. C# dilinde polimorfizm özellikleri, nesne yönelimli programlama paradigmalarının temel taşlarından biridir. Bu makalede, polimorfizmin nasıl uygulanacağı ve örnekler sunulacaktır.


Kalıtım (Inheritance)

Kalıtım (inheritance), bir class'ın başka bir class'tan miras almasıdır. Yani, bir class, başka bir class'ın özelliklerini ve metodlarını kullanabilir. Bu birçok avantaj sağlar, özellikle kod tekrarını ve bakım maliyetlerini azaltır. Ayrıca, kalıtım, kodun okunabilirliğini ve anlaşılabilirliğini artırır.

C# programlama dilinde kalıtım, bir class'ın ":" sembolünü kullanarak başka bir class'a miras alınmasıyla yapılır. Kalıtım işlemi, başka bir class'ta tanımlı olan özellikleri ve metodları, yeni class için kullanılabilir hale getirir. Kalıtım sayesinde kodun yeniden kullanılabilirliği artar ve daha az kod yazmaya ihtiyaç duyulur.

C# programlama dilinde kullanılan kalıtım türleri single inheritance ve multi-level inheritance olarak ikiye ayrılır. Single inheritance, bir class'ın sadece bir class'tan miras almasını sağlar. Multi-level inheritance ise birden fazla class'a miras almayı sağlar.

  • Single inheritance örnekleri:
    • Birden fazla class olmadan bir class'ı bir class'tan miras almak için kullanım örneği.
    • Birden fazla class'ın olduğu ve bir class'ın yalnızca başka bir class'tan miras aldığı kullanım örneği.
  • Multi-level inheritance örnekleri:
    • Birden fazla class oluşturup miras alma işlemi yaparak kullanım örneği.
    • Üst üste sıralandığında doğru bir şekilde miras alınabilen kullanım örneği.

Kalıtım ile elde edilen class'lar, base class'ın sahip olduğu özelliklere ve metodlara sahip olacaktır. Kalıtım yapılarında base class, başka bir class'a miras verirken temel özellikleri sağlar ve child class, temel özelliklere sahip olarak base class üzerine kendi özelliklerini ekleyebilir.


Single Inheritance ve Multi-level Inheritance

C# programlama dilinde kalıtım yapısı, nesne yönelimli programlama (OOP) için önemli bir yapı taşıdır. Kalıtımın amacı, yeni bir sınıf oluşturarak mevcut sınıfın özelliklerini miras almasıdır. Bu sayede, kod tekrarından kaçınılarak daha az kod yazılabilir ve kod tekrarını önleyen daha anlaşılır ve düzenli bir kod yazımı sağlanabilir.

Single inheritance, bir üst sınıfın sadece bir alt sınıf tarafından miras alınmasını ifade eder. Multi-level inheritance ise bir sınıfın bir başka sınıf tarafından miras alındığı, o sınıfın da bir başka sınıf tarafından miras alındığı yapıdır. Örneğin, A sınıfı B sınıfı tarafından miras alındığında, B sınıfı C sınıfı tarafından miras alındığında multi-level inheritance yapısal olarak oluşmuştur.

Single inheritance ve multi-level inheritance kavramlarının örnek kodlama yapıları, tüm adımlarıyla birlikte açıklanacaktır. Ayrıca progeny yazılımı kullanılarak grafiksel bir şekilde yapı gösterilip daha iyi anlaşılması sağlanacaktır.


Single Inheritance Örnekleri

C# programlama dilinde kalıtım özellikleri kullanarak, bir sınıfın özelliklerini başka bir sınıfın kullanması mümkündür. Single inheritance özellikleri ile bir sınıfın sadece bir tane temel sınıftan özellikler alabilmesi sağlanır. İşte single inheritance özelliklerinin kullanımına örnek kodlama yapıları:

Temel Sınıf Türetilmiş Sınıf Kodlama Yapısı
Baba Çocuk class Baba {'{'}
 public int babaninOzelligi;
{'}'}
class Çocuk : Baba {'{'}
 public int cocugunOzelligi;
 public void cocugunMetodu() {'{'}
  Console.WriteLine("Çocuk sınıfında bu metod çalıştı!");
 {'}'}
{'}'}
Hayvan Köpek class Hayvan {'{'}
 public int yas;
{'}'}
class Köpek : Hayvan {'{'}
 public string isim;
 public void havlayanMetodu() {'{'}
  Console.WriteLine("Hav hav! Köpek sınıfında bu metod çalıştı!");
 {'}'}
{'}'}

Yukarıdaki örneklerde, baba sınıfı ve hayvan sınıfı temel sınıflar olarak kullanılmıştır. Bunlardan türetilen çocuk sınıfı ve köpek sınıfı ise temel sınıfların özelliklerini alarak kendi özelliklerini de eklemişlerdir. Bu sayede, kodlama yapılarını tekrarlamak yerine temel sınıftan özellikleri miras alarak kodların tekrarlanması önlenmiştir.


Multi-level Inheritance Örnekleri

Multi-level inheritance, yani çok seviyeli kalıtım, C# dilinde bir sınıfın, başka bir sınıftan kalıtım yoluyla, kendisine kalıtım yapmış bir başka sınıfın özelliklerine de sahip olması anlamına gelir. Bu sayede kodlamanın tekrarından kaçınılarak daha az kod yazılır ve kodlar daha okunaklı hale gelir.

Örneğin, bir Hayvan sınıfı oluşturup bu sınıfın içerisinde tüm hayvanların ortak özelliklerini barındırabiliriz. Daha sonra, Kedi sınıfı oluşturup Hayvan sınıfından kalıtım alır ve Kedi sınıfına kediye özgü özellikler eklenir. Son olarak da, İran Kedisi sınıfı oluşturup Kedi sınıfından kalıtım alır ve İran Kedisi sınıfına İran kedisiye özgü özellikler eklenir. Bu sayede, Hayvan sınıfından kalıtım alarak, tüm hayvanların ortak özelliklerini bir kez daha tanımlamamıza gerek kalmaz.

Sınıf Özellikler
Hayvan ad, yaş, cinsiyet
Kedi renk, sevimlilik
İran Kedisi boyut, tüy uzunluğu

Yukarıdaki örnekte görüleceği gibi, İran Kedisi sınıfı, Kedi sınıfından kalıtım alırken Kedi sınıfı da Hayvan sınıfından kalıtım alır. Bu sayede, İran Kedisi sınıfı da Hayvan sınıfının ortak özelliklerine sahip olur.


Multiple Inheritance

C# dilinde multiple inheritance kullanılmamasına rağmen, bu kavramın ne olduğu anlatılabilir. Multiple inheritance, bir sınıfın birden fazla sınıftan kalıtım alabilmesine olanak sağlar. Ancak, C# dilinde multiple inheritance kullanılmama sebebi, çelişkili durumlar yaratabilecek olmasıdır. Örneğin, iki farklı sınıftan gelen aynı isimli bir metot, hangi sınıfın kullanılacağı belirsizliği yaratabilir. Bu sebeple, C# dilinde multiple inheritance yerine interface kullanılmaktadır.

Interface'ler, bir sınıfın birden fazla arayüzü uygulayabilmesini sağlayan yapıdır. Yani, bir sınıfın birden fazla özelliği sağlamak için farklı interface'leri implemente edebilmesi mümkündür. Bu sayede, her bir interface'in kendi özelliğine sahip bir metodu vardır ve çelişki oluşmaz.

Örneğin, bir Araba sınıfı için, IArac interface'inde "HareketEt" metodu belirtilirken, ISesSistemleri interface'inde "SesCikar" metodu belirtilebilir. Araba sınıfı, hem IArac hem de ISesSistemleri interface'lerini implemente ederek, hem hareket etme özelliğine hem de ses çıkarma özelliğine sahip olabilir. Bu sayede, C# dilinde multiple inheritance yerine interface kullanmak daha uygun bir seçenek olarak karşımıza çıkmaktadır.


Polimorfizm (Polymorphism)

Polimorfizm (Polymorphism) C# dilinde oldukça önemli bir kavramdır. Bu kavram, bir nesnenin farklı şekillerde kullanabilmesi anlamına gelir. Aynı kod bloğu, farklı türevlerdeki nesneler tarafından farklı şekillerde kullanılabilir. Polimorfizm, C# programlama dilinde çok sayıda farklı amaç için kullanılabilir.

Polimorfizmin kullanılması, kod tekrarını azaltır ve kodların daha sade ve okunaklı hale gelmesini sağlar. Ayrıca, kodun yeniden kullanılabilirliğini artırır ve bakım maliyetlerini düşürür. Polimorfizm, C# dilinde çok sayıda farklı şekilde uygulanabilir. Bunlar arasında method overloading ve virtual methods gibi teknikler yer alır.

Polimorfizm Teknikleri Açıklama
Method Overloading Aynı isimdeki birden fazla metoda farklı parametreler eklemek ve bu sayede nesne farklı şekillerde kullanabilir.
Virtual Methods Başlangıçta boş olan metodlara, farklı türevlerdeki nesneler tarafından farklı şekillerde davranacak kodlar ekleyerek polimorfizmi sağlamak.

Method Overloading, C# dilinde oldukça yaygın olarak kullanılan bir polimorfizm tekniklerinden biridir. Aynı isimdeki metotlar, farklı parametreler aldığında farklı şekillerde davranır. Virtual methods ise başlangıçta boş olan metotlara farklı türevlerdeki nesneler tarafından farklı kod blokları eklendiğinde polimorfizm ortaya çıkar. Bu sayede nesneler, farklı şekillerde kullanılabilirler.

Örneğin, bir araba sınıfı düşünelim. Arabanın start metodu her araç için aynıdır, ancak farklı araba türleri için farklı şekillerde davranabilir. Bir spor araba hızlanırken motoru daha güçlü çalıştırarak yüksek hızlara ulaşırken, bir ticari aracın motoru aynı hızlanma için daha fazla güç harcayabilir. Bu farklı davranışlar, polimorfizm sayesinde elde edilir ve kodun okunaklığı ve sadeleştirilmesine yardımcı olur.


Çok Biçimlilik (Overloading)

Çok Biçimlilik (Overloading), C# programlama dilinde aynı isimde farklı parametrelerle birden fazla method oluşturulmasına denir. Yani bir sınıf içerisinde aynı isimde birden fazla method tanımlayarak, methodlara farklı parametreler vererek bu yöntem kullanılır.

Overloading'in kullanımı, aynı işi yapan farklı methodların aynı isimde olmasını engellediği gibi, kodun okunabilirliğini de arttırır. Farklı amaçlarla kullanılan methodların birbiriyle karıştırılması olasıdır, ancak aynı isimde birden fazla method kullanıldığında bu karışıklık ortadan kalkar.

Overloading'de parametreler farklı tipte, sayıda veya bir kombinasyon halinde olabilir. Örneğin, bir sayının karesi alındığındaki methodla bir sayının küpü alındığındaki method aynı isimde farklı parametrelerle tanımlanabilir.

Method Adı Parametreler Açıklama
SayiTopla a (int), b (int) Verilen iki tamsayıyı toplayan method
SayiTopla a (float), b (float) Verilen iki ondalıklı sayıyı toplayan method

Yukarıdaki tabloda SayiTopla methodu, aynı isimde iki farklı parametrelerle oluşturulmuştur. Bu sayede hem tamsayılar hem de ondalıklı sayılar toplanabilir.

Overloading yaparken, methodların dönüş değerlerindeki farklılıklar göz önünde bulundurulmalıdır. Aynı isimde farklı dönüş değerleri olan methodlar tanımlanabilir, ancak bu durum kodun okunurluğunu azaltır. Genellikle aynı işi yapan methodların dönüş değerlerinin de aynı olması tercih edilir.

Özetle, Overloading aynı isimde farklı parametrelerle method tanımlama yöntemidir. Bu yöntem okunabilirliği arttırdığı gibi, kodu daha kolay yönetilebilir hale getirir.


Sanal Metotlar (Virtual Methods)

Sanal metotlar, kalıtım ve polimorfizm özellikleriyle birlikte sık kullanılan C# dilinin önemli özelliklerinden biridir. Sanal metotlar, bir sınıfın alt sınıfları tarafından ezilebilen ve farklı şekillerde davranabilen metotlardır. Bu, alt sınıfların ana sınıfın metotlarını kendilerine özgü şekilde uygulayabilecekleri ve genişletilebilir bir kodlama yapısı sağlayacakları anlamına gelir.

Sanal metotlar, genellikle çalışma zamanı bağlama (runtime binding) ile (dinamik olarak) çağrılırlar ve bu nedenle programcıların Override anahtar sözcüğünü kullanarak ezilebilmelerini sağlayan bazı kriterlere uyması gerekir. Bu kriterler şunlardır:

- Sanal metot, sınıfın ana öğelerinden biri olan "virtual" anahtar sözcüğü ile tanımlanmalıdır.- Sanal metot, erişim belirleyicileri (public, private, protected) kısıtlamaları olmadan oluşturulabilir.- Alt sınıf, ana sınıfın sanal metotunu override etmek istiyorsa, alt sınıfında aynı isim ve imza ile ezme (override) işlemini gerçekleştirebilir.

Aşağıda, sanal metotların kullanımını gösteren bir örnek kodlama yapısı vardır:

```public class AnaSinif{ public virtual void EkranaYazdir() { Console.WriteLine("Ana sinifin ekrana yazdir metodu calisti."); }}

public class AltSinif : AnaSinif{ public override void EkranaYazdir() { Console.WriteLine("Alt sinifin ekrana yazdir metodu calisti."); }}

static void Main(string[] args){ AnaSinif asinif = new AnaSinif(); asinif.EkranaYazdir();

AltSinif altSinif = new AltSinif(); altSinif.EkranaYazdir(); }```

Yukarıdaki örnekte, AnaSinif ve AltSinif'in birbirine kalıtım yoluyla bağlı olduğunu görebilirsiniz. AnaSinif sınıfının EkranaYazdir() sanal metodu, AltSinif sınıfı tarafından override edilmiştir. Bu nedenle, ana sınıfın metodu çalıştırıldığında "Ana sinifin ekrana yazdir metodu calisti" mesajı ekrana yazdırılırken, alt sınıfın metodu çalıştırıldığında "Alt sinifin ekrana yazdir metodu calisti" mesajı ekrana yazdırılır.

Sanal metotlar, C# dilinin büyük projelerde bile yönetilebilir, genişletilebilir ve kolay anlaşılır kodlama yapısını sağlayan önemli bir özelliktir. Bu nedenle, programcıların sanal metotların özelliklerini ve nasıl kullanıldıklarını çok iyi bilmeleri gerekmektedir.


Çoklu Biçimlilik (Polymorphism) Örnekleri

Çoklu Biçimlilik (Polymorphism) konsepti, farklı sınıflara ait nesnelerin, aynı özelliklere/sınıflara sahipmiş gibi kullanılabilmesine olanak sağlar. Bu özellik, C# programlama dilinde oldukça sık kullanılır. İşte birkaç örnek:

  • Method Overriding: Bu, alt sınıfların üst sınıflardaki metotları ezmelerine izin verir. Örneğin, bir üst sınıf olan "Araba", "Hızlan" adında bir metoda sahip olsun. Alt sınıf "BinekAraba" bu metodu override ederek, artık farklı bir şekilde çalışabilir. Bu, "Hızlan" metodu çağrıldığında, artık alt sınıfın özel işlemlerini gerçekleştirdiği anlamına gelir.
  • Polymorphic Method: Bu metot, nesnelerin farklı şekillerde davranabilmesine olanak tanır. Bir metot, farklı parametrelerle (farklı tiplerde nesnelerle) çağrılabilir. Bu, alt sınıfların üst sınıfların metotlarını aynı isimde kullanmalarına izin verir.

Özetle, Çoklu Biçimlilik (Polymorphism) özelliği, C# programlama dilinde oldukça kullanışlıdır. Birden fazla Sınıfın, aynı özelliklere/arametrelere sahipmiş gibi kullanılabilmesi yapısını tanımlayan bir özelliktir. Bu özellik ile farklı sınıflarda aynı metotları kullanabilmek mümkün hale gelebilir.


Abstract and Sealed Class

Abstract ve sealed class yapısı, C# programlama dilinde sıklıkla kullanılan yapılar arasındadır. Abstract classlar, diğer sınıfların özelliklerini ve methodlarını miras alarak, farklı senaryolarda kullanılabilirler. Sealed classlar ise, sınıfın kendisi için miras alınabilirliğini kapatan bir sınıf türüdür.

Abstract classlar, genellikle, ana sınıfın kullanacağı methodları, özellikleri ve değişkenleri barındırmak için kullanılırlar. Diğer sınıflar bu özellikleri ve methodları miras alarak, kendi yapısında kullanabilirler. Bu sayede, kod tekrarından kaçınılır ve daha az hata kaynağı yaratılır. Abstract classlar, aynı zamanda, sınıfın yapısını belirleyen önemli bir etkendir.

Sealed classlar ise, belirli bir sınıf yapısının miras alınmasını engellerler. Bu sınıf yapısına sahip olan sınıflar, sealed sınıf yapısından inheritance alamazlar. Fakat bu yapının bir dezavantajı da vardır. Sınıfların miras alınabilirliği kısıtlanarak, özelleştirilmesi engellendiği için, sınıf hiyerarşisinin daha az esnek olmasıdır.

Bir örnek kodlama yapısı olarak, abstract class oluşturma aşağıdaki gibi yapılabilir:

Abstract Class Description
public abstract class Person Abstract class, ana sınıf Person'un yapısını belirleyen bir sınıftır.

Bir örnek kodlama yapısı olarak, sealed class oluşturma aşağıdaki gibi yapılabilir:

Sealed Class Description
public sealed class Bird : Animal Sealed class, Animal sınıfının sadece kuş türlerinde inheritance almasını engeller.

Abstract Class Örnekleri

Abstract classlar, devralınan sınıfların metodlarını uygulamak zorunda olduğu ancak kendisine özgü metodları da içerebilen sınıflardır. İşte, bu özelliği sayesinde Abstract Classlar, kalıtım konusunda daha fazla esneklik sağlarlar. Peki, Abstract Classlar nasıl kullanılır ve örnek kodlamaları nasıl yapılır?

Öncelikle, Abstract Class'ı nasıl tanımlanacağını gözden geçirelim. "Abstract" anahtar sözcüğü kullanılarak bir sınıfın Abstract Class olduğunu belirtiyoruz. Bu şekilde bir sınıf oluşturma işlemini gerçekleştirirken, sınıfın içerisinde birden fazla metod ve özellik tanımlayabilirsiniz. Ancak dikkat edilmesi gereken nokta, metodların body kısmının boş olması gerektiğidir. Bu metodlar, kalıtım yoluyla miras alan sınıflar tarafından uygulanmak zorundadır.

Şimdi bir örnek vererek konuyu daha iyi anlamaya çalışalım. Örnek olarak, bir meyve deposunda bulunan meyveleri toplamak için gerekli olan bir abstract class tanımlayalım. Bu abstract class sayesinde, meyve yetiştiricileri tarafından bir meyve deposu oluştururken, o depoda bulunması gereken meyveleri de tanımlayabilirler. Bu abstract class tamamlanarak, ürünleri depolayan kısma, yani bizim örneğimizde meyve deposuna entegre edilmeye hazırdır.

Meyve Adı Meyve Ağırlığı
Elma 1 kg
Armut 1.5 kg

Bu örneği incelediğimizde, meyve yetiştiricileri meyvelerini tanımlamak için bu sınıfı kullanabilirler. Ayrıca, sınıfın içindeki metodların body kısmı burada boş olduğundan, meyvelerin hasat edilme şekilleri, bakım ve sulama yapılıp yapılmadığı gibi konular, meyve yetiştiricilerine kalmıştır. Bu sayede, daha fazla esneklik sağlanmış olur.


Sealed Class Örnekleri

Sealed classlar, miras alınan bir sınıfın özelliklerini kullanmak yerine, nihai olarak işaretlenen bir sınıftır ve nesnelerin bu sınıftan türetilebilir yapısı kapatılır. Sealed classlar, özellikle standart kütüphane sınıflarının yazılmasında sıkça kullanılır.

Bir sınıfı mühürleyebilmek için, sınıf tanımının önüne "sealed" anahtar kelimesi eklenir. Bu şekilde sınıf, türetilme özelliği devre dışı bırakılır. Şimdi basit bir örnek inceleyelim.

Örnek Kod: Açıklama:
        sealed class Araba        {             public string Model { get; set; }             public int Hiz { get; set; }        }        class Otobus : Araba        {            int YolcuKapasitesi { get; set; }        }      
Yukarıdaki örnekte, Sealed Class olan "Araba", Otobus sınıfı tarafından türetilemez. "Otobus" ama "Araba" nın özelliklerini kullanabilir.

Bir başka örnek olarak, bir interface sınıfı da kapatılabilir. "IAnimal" isimli bir interface sınıfı yazdığımızı ve bu sınıfın "Canli" isimli bir sınıf tarafından uygulandığını varsayalım. Şimdi, bu interface sınıfının kapatılması için "sealed" anahtar kelimesi kullanalım:

Örnek Kod: Açıklama:
        interface IAnimal        {            void Beslen();            void Uyur();        }        sealed class Canli : IAnimal        {            public void Beslen() { }            public void Uyur() { }        }        class Kedi : Canli        {            //üreme ve yavrulama gibi özellikleri kendi içinde barındırabilir.        }      
Yukarıdaki örnekte, "Canli" sınıfı IAnimal interface'ini kullanarak türetilir. "Kedi" sınıfı ise, "Canli" sınıfından türetilebilirken, "Canli" sınıfından türetilemez .

Sealed classlar, programlama kodunun daha güvenli hale getirilmesini sağlar. Bir mührü olan sınıf, türemesi muhtemel olan sınıflara karşı nihai bir koruma sağlar.