Nesne Yönelimli Programlamanın ikinci temel prensibi olan inheritance, yani kalıtım konusuna bakacağız. Bir önceki prensipte olduğu gibi gerçek hayat ve kod örnekleri ile anlatmaya çalışacağım. Hemen konuya geçelim.

Gerçek hayat deyip, bir de"Neden böyle bir resim seçtim ben de bilmiyorum" gibi bir laf etsem saçma olurdu herhalde. OOP öğrenmeye çalıştığım ilk dönemleri hatırlıyorumda, kalıtımla ilgili kafamda bir sürü örneğim oluşuyorken nedense hep evrenle ilgili örneğim beni cezbediyordu. Garip bir şekilde bir tek beni cezbediyormuş ki internette benzer bir örneğe rastlamadım. 😎 Evren dediğimiz sonsuz boşluk içinde bir sürü gezegen, uydu, yıldız, gök cismi... Dahası bunların bağlı olduğu takım yıldızları, sistemler, galaksiler... Şu an bu yazıyı yazdığım yerküre; güneşe bağlı dönüşü ile kendi has geoid şeklini aldığı, bildiğimiz anlamda yaşamın olduğu tek gezegen. Bu şekilde tek tek saydıklarım birer property, dünyanın gezegen olma gerekliliklerini yerine getiren özellikleri. Yani dönüş hızı, çapı gibi kavramlar onun özellikleri, bağlı olduğu sınıf ve/veya sınıflar ise kalıtımıdır. Evet dünyamız bir gezegen, ama aynı zamanda da bir gök cismidir. Gök cismi sınıfını kalıtım aldığı için onun da kütle, bilinen ömrü gibi özelliklerini de taşır. Aynı samanyolu galaksisinde yer almamıza rağmen güneşimiz, bir gezegen değil bir yıldız ve aynı zamanda bir gök cismidir.

Bir hususi aracı ele alalım; bu araç kullanım şekli ticari olmayan bir motorlu taşıttır ancak bu araç bir taksi ise kullanım şekli ticaridir. Ben, hususi ve ticari iki ayrı kullanım şeklinden bahsetsem de bunlar daha ayrıntılı olacaksa ayrı birer sınıf olarak ele alınmalıdır. Benzer şekilde, bir kamyonun kullanım şekli ticaridir ya da ticari sınıfa aittir. Ancak bir ağır vasıta olduğu düşünüldüğünde farklı geliştirmeler olacağı açıktır. O yüzden ayrı bir ağır vasıta sınıfı açılıp bu sınıfın da ticari sınıftan kalıtım alması sağlanır.

Aslında en gerçek hayat örneklerini Microsoft da bir sürü yerde kullanmıştır; bunlardan sadece bir tanesi .NET System.ComponentModel namespace içinde yeralan System.Windows.Forms için kullanılan Button sınıfıdır. Button sınıfı ButtonBase sınıfından, ButtonBase, Control sınıfından kalıtım alır.

namespace GurkanTuna.Inheritance {
	
	    class Planet : CelestialBody {
        /// 
        /// Yörünge Uzunluğu
        /// 
        public decimal Orbit { get; set; }
        /// 
        /// Yerçekimi
        /// 
        public decimal Gravity { get; set; }
        /// 
        /// Yarıçap
        /// 
        public decimal Radius { get; set; }
		
        public decimal RotationSpeed { get; set; }
    }

    class Star : CelestialBody {
        public Star() {
            /*
            Yıldızlar genellikle hidrojen ve helyumdan oluşur.
            Ama kesinlik olmadığı çin listeyi değiştirilebilir bırakıyoruz.
             */
            Content = new[] { "Hidrojen", "Helyum" };
        }
        public string[] Content { get; set; }
    }

    class Sun : Star {
        public HashSet Planets { get; set; }
    }

    /// 
    /// Gök Cismi
    /// 
    class CelestialBody {
        public string Name { get; set; }
        public decimal Mass { get; set; }
        public decimal KnownLifeTime { get; set; }
    }
    class Galaxy {
        public HashSet CelestialBodies { get; set; }
    }

    abstract class VehicleBase {
        public string Model { get; set; }
        
        public abstract VehicleUsageType UsageType { get; }
    }

    class LightVehicle : VehicleBase {
        public override VehicleUsageType UsageType => VehicleUsageType.Private;
    }

    class HeavyVehicle : VehicleBase {
        public decimal MaximumPayload { get; set; }
		
        public override VehicleUsageType UsageType => VehicleUsageType.Commercial;
    }

    class Car : LightVehicle {

    }

    class Truck : HeavyVehicle {

    }

    enum VehicleUsageType {
        None,
        Private,//Hususi
        Commercial//Ticari
    }
}