14 Kasım 2017 Salı

C#'ta Kalıtım (Inheritance) - Kalıtıma Giriş - Part 1

Merhaba,

Bu yazı dizimde sizlere Object Oriented Programming'in en güçlü özelliklerinden biri olan Kalıtım(Inheritance)'ı anlatmaya çalışacağım. Bu yazıdan itibaren sırayla 4 part şeklinde anlatmaya çalıştım. Part 1'imize giriş yaparak başlayalım.

Bildiğiniz üzere OOP'un 3 temel prensibi vardır.
  1. Sarmalama (Encapsulation) (daha sonra detaylı olarak anlatacağım)
  2. Çok Biçimlilik (Polymorphism) (daha sonra detaylı olarak anlatacağım)
  3. Kalıtım (Inheritance)
OOP mimarisinde hedeflenen şeylerden birisi de kod tekrarını önlemektir. Bir kodu bir yerde yazıp defalarca kez her yerde kullanabilmektir. Kalıtım bu amaca da hizmet etmektedir. Dolayısıyla kalıtım, C# olsun Java olsun OOP mimarisinin çok güçlü bir özelliğidir. Kalıtım herkesin bildiği üzere bir sınıfın özelliklerini devralabilme özelliğidir. Bu çok önemlidir. Aynı zamanda hiyerarşik bir yapı oluşturmamızı da sağlar. Örneğin elma, meyve sınıfının bir örneğidir ve meyve sınıfının bütün özelliklerini taşır ama aynı zamanda kendine özgü özellikleri vardır.

Kalıtım yoluyla özellikleri alınan sınıfa temel sınıf, özellikleri devralan sınıfa da türetilmiş sınıf denir. Bu yazı dizisinde bu kavramları sık sık kullanacağım.

Hemen bir örnekle başlayalım. İki boyutlu şekilleri ifade eden bir sınıfımız olsun. Bu sınıftan üçgen sınıfı türetelim.

using System;

namespace Kalitim
{
    class IkiBoyutluSekil
    {
        public double Genislik;
        public double Yukseklik;

        public void BoyutGoster() {
            Console.WriteLine("Genişlik: " + Genislik + " Yükseklik: " + Yukseklik);
        }
    }

    class Ucgen : IkiBoyutluSekil {
        public double Alan() {
            return Genislik * Yukseklik / 2;
        }
        public void AlanGoster() {
            Console.WriteLine("Üçgenin Alanı: " + Alan().ToString());
        }
    }

    static void Main(string[] args)
    {
        Ucgen ucgen = new Ucgen();
        ucgen.Genislik = 10;
        ucgen.Yukseklik = 20;
        ucgen.BoyutGoster();
        ucgen.AlanGoster();
        Console.Read();
    }
}

Bu programın çıktısı aşağıdaki gibi olacaktır:

Genişlik: 10 Yükseklik: 20
Üçgenin Alanı: 100

Dikkat edilirse Ucgen sınıfı Genislik, Yukseklik alanlarını ve BoyutGoster() metodunu temel sınıftan (IkiBoyutluSekil sınıfı) kalıtım yoluyla devralmıştır. Ayrıca Ucgen sınıfında bu kodların yazılmasına gerek yoktur. Bununla birlikte IkiBoyutluSekil sınıfının Ucgen sınıfından hiçbir şekilde haberi yoktur. Kalıtımın en temel hali bu şekildedir.

Önemli Not: C++ ile kod yazanlar bilir ki, bir sınıf birden çok sınıf özelliklerini kalıtım yoluyla devralabiliyordu. Fakat C#'ta bir sınıf yalnızca tek bir sınıftan türeyebilir. Yani aşağıdaki gibi bir ifade C# için hatalıdır.

class A {}
class B{}
class C : A, B {} //Hata!!! Birden çok sınıf miras alınamaz!

Bunun nedeni şudur: Diyelim ki, A ve B sınıfları da X sınıfından türemiş olsun. A ve B sınıfları X sınıfındaki herhangi bir metodu override ettiğinde C sınıfı hangi sınıfın override metoduna sahip olacak, A'nın mı B'nin mi? gibi problemler olmasın diye bu şekilde çoklu kalıtıma izin verilmemiş. Peki C++'ta bu nasıl çözülüyordu? Bunun detaylarına şimdi girmek istemiyorum ama çeşitli çözümler tabi ki getirilmişti ama bundan neden vazgeçildi diye sorulursa; casting, reflection gibi konularda fazlaca karışıklık getirmesinden çekinilmiştir. Zaten çoklu kalıtımı interfacelerle istediğimiz gibi yönetebiliyoruz hem de çok daha basit halde.

Bunun tersi ise geçerlidir. Yani A sınıfından B ve C sınıfları türeyebilir.

class B : A {} ve class C : A {} ifadeleri geçerlidir.

Bir sınıf birden fazla sınıfı kalıtım yoluyla devralamaz demiştik fakat birden fazla interface'i uygulayabilir. Bunu ilerleyen derslerde ele alacağız.

Kalıtımda türetilmiş sınıf, temel sınıfın bütün public özelliklerini devralabilir. Fakat private özelliklerini devralamaz. Bunun için farklı mekanizmalar geliştirilmiştir.

Bu yazımızda kısaca kalıtım konusuna giriş yaptık. Bir sonraki yazımızda "Kalıtımda Üye Erişimi" konusunu ele alacağız.

Sağlıcaklakalın...


Paylaş:

0 yorum:

Yorum Gönder

Bu Blogda Ara