OOP'de Inheritance

Miras en önemli kavramlardan biridir.Object-Oriented Programming. Bir sınıfın başka bir sınıftan özellik ve yöntemler almasına olanak tanıyarak kodun yeniden kullanılmasını, ilgili mantığın düzenlenmesini ve esnek yazılım sistemleri oluşturulmasını kolaylaştırır.

Kalıtım, aynı kodu farklı sınıflarda tekrar tekrar yazmak yerine, geliştiricilerin paylaşılan bir yapı oluşturmasına yardımcı olur. Genel bir sınıf ortak davranışı tanımlayabilir, daha spesifik sınıflar ise bu davranışı genişletebilir ve kendi özelliklerini ekleyebilir.

Giriş

Bu OOP serisinin önceki makalelerinde sınıfları, nesneleri, özellikleri, yöntemleri, yapıcıları ve yıkıcıları tanıttık. Bu kavramlar nesnelerin nasıl oluşturulduğunu, veri ve davranışları nasıl sakladıklarını anlamamıza yardımcı olur.

Kalıtım, sınıfların birbirine nasıl bağlanabileceğini göstererek bu fikirlere dayanır. Gerçek yazılım projelerinde birçok nesne birbiriyle ilişkilidir. Örneğin, bir kullanıcı, yönetici ve düzenleyicinin tümü ad, e-posta adresi ve şifre gibi ortak bilgileri paylaşabilir. Ancak her birinin farklı izinleri ve sorumlulukları da olabilir.

Kalıtımı kullanarak, paylaşılan mantığı bir üst sınıfa yerleştirebilir ve diğer sınıfların bundan miras almasına izin verebiliriz. Bu, kodun daha temiz, bakımı kolay ve daha düzenli olmasını sağlar.

Object-Oriented Programming'da Kalıtım Nedir?

OOP'daki miras, bir sınıfın başka bir sınıfın özelliklerini ve yöntemlerini kullanabileceği anlamına gelir. Paylaşılan kodu sağlayan sınıfa genellikle denir.ebeveyn sınıfı,temel sınıfveyaüst sınıf. Bu kodu alan ve genişleten sınıfa denir.çocuk sınıfı,türetilmiş sınıfveyaalt sınıf.

Ana fikir basittir: eğer birkaç sınıf ortak davranışı paylaşıyorsa, aynı kodu her sınıfta kopyalamamıza gerek yoktur. Bunun yerine, ortak davranışı bir kez ana sınıfta tanımlarız, ardından alt sınıfların onu devralmasına izin veririz.

Örneğin, bir genelKişisınıf, ad ve e-posta gibi özellikleri içerebilir. birÖğrencisınıf ve birÖğretmensınıf, Kişiden miras alabilir çünkü her ikisi de insan türüdür. Daha sonra her alt sınıf kendi spesifik özelliklerini ve yöntemlerini ekleyebilir.

Miras Neden Önemlidir

Kalıtım önemlidir çünkü kodun yeniden kullanımını ve daha iyi yazılım organizasyonunu destekler. Kalıtım olmadan geliştiriciler aynı mantığı birçok farklı yerde tekrarlayabilir. Bu, uygulamanın güncellenmesini zorlaştırabilir ve hata içerme olasılığını artırabilir.

Bir ebeveyn sınıfına ortak mantık yerleştirildiğinde değişiklikler tek bir yerde yapılabilir. Bir yöntemin iyileştirilmesi veya paylaşılan bir özelliğin güncellenmesi gerekiyorsa geliştirici ana sınıfı değiştirebilir ve alt sınıflar bu değişiklikten yararlanabilir.

Kalıtım aynı zamanda gerçek dünya ilişkilerinin kodda temsil edilmesine de yardımcı olur. Çoğu sistem, genel bir türe ve daha spesifik alt türlere sahip nesneler içerir. OOP mirası bu ilişkinin net bir şekilde modellenmesine olanak tanır.

Ebeveyn Sınıfı ve Çocuk Sınıfı

Ebeveyn sınıfı paylaşılan yapıyı içerir. Alt sınıfların kullanımına sunulması gereken özellikleri, yöntemleri, yapıcıları ve diğer mantığı içerebilir. Alt sınıf, ana sınıftan miras alır ve programlama diline ve erişim değiştiricilerine bağlı olarak genel veya korumalı üyelerini kullanabilir.

Bir alt sınıf, yalnızca o alt sınıfa ait olan ek özellikleri ve yöntemleri de tanımlayabilir. Bu, paylaşılan mantığı ana sınıftan korurken alt sınıfın daha spesifik olmasını sağlar.

Örneğin, adı verilen bir ebeveyn sınıfıÇalışanisim, e-posta ve maaş içerebilir. Bir alt sınıf çağrıldıYöneticibu özellikleri devralabilir ve raporları onaylamak için bir yöntem ekleyebilir. Başka bir çocuk sınıfı aradıGeliştiriciaynı çalışan verilerini devralabilir ve kod yazmak veya görevleri yönetmek için bir yöntem ekleyebilir.

Basit Miras Örneği

Aşağıdaki temel örneği düşünün:

class User {
    public string $name;
    public string $email;

    public function login() {
        return $this->name . " logged in.";
    }
}

class Admin extends User {
    public function deletePost() {
        return "Post deleted by admin.";
    }
}

Bu örnekte,Kullanıcısınıf ana sınıftır. Adı, e-postayı ve oturum açma yöntemini içerir.Yöneticisınıf Kullanıcıyı genişletir; bu, Yöneticinin Kullanıcının özelliklerini ve yöntemlerini devraldığı anlamına gelir.

Bir Admin nesnesi, User sınıfındaki oturum açma yöntemini kullanabilir ve aynı zamanda kendi deletePost yöntemini de kullanabilir. Bu, mirasın gücüdür: alt sınıf, paylaşılan işlevselliği korur ve daha spesifik davranışlar ekler.

Genişletilmiş Anahtar Kelime

Birçok programlama dili, kalıtımı tanımlamak için bir anahtar kelime kullanır. PHP, Java ve diğer bazı dillerde anahtar kelimeuzanırBir sınıfın başka bir sınıftan miras almasını sağlamak için kullanılır.

Yapı genellikle şöyle görünür:

class ChildClass extends ParentClass {
    // child class code
}

Bu şu anlama geliyorÇocuk Sınıfıerişilebilir özelliklerini ve yöntemlerini alırEbeveyn Sınıfı. Alt sınıf daha sonra gerektiğinde yeni davranış ekleyebilir veya devralınan davranışı özelleştirebilir.

Her ne kadar sözdizimi programlama dilleri arasında değişse de kavram aynıdır: Kalıtım, genel bir sınıf ile daha spesifik bir sınıf arasında bir ilişki yaratır.

Kalıtımla Kodun Yeniden Kullanımı

Kalıtımın temel faydalarından biri kodun yeniden kullanılmasıdır. Birden fazla sınıf aynı işlevselliğe ihtiyaç duyduğunda, bu işlevsellik her bir alt sınıfa kopyalanmak yerine bir üst sınıfa yerleştirilebilir.

Örneğin bir web uygulamasında farklı türde kullanıcıların oturum açması, oturumu kapatması, profillerini güncellemesi veya parolalarını değiştirmesi gerekebilir. Bu ortak eylemler genel bir Kullanıcı sınıfına yerleştirilebilir. Daha sonra Yönetici, Müşteri, Yazar ve Editör sınıfları Kullanıcıdan miras alabilir ve kendi benzersiz özelliklerini ekleyebilir.

Bu yaklaşım tekrarlamayı azaltır ve uygulamanın güncellenmesini kolaylaştırır. Oturum açma mantığı değişirse geliştirici, kullanıcıyla ilgili her sınıfı ayrı ayrı düzenlemek yerine bunu Kullanıcı sınıfında güncelleyebilir.

Yöntemi Geçersiz Kılma

Kalıtım yalnızca alt sınıfların yöntemleri yeniden kullanmasına izin vermez. Ayrıca davranışları özelleştirmelerine de olanak tanır. Buna deniryöntem geçersiz kılma.

Yöntem geçersiz kılma, bir alt sınıf, üst sınıftaki yöntemle aynı ada sahip bir yöntemi tanımladığında gerçekleşir. Alt sürüm, söz konusu alt sınıf için üst sürümün yerini alır veya onu özelleştirir.

Örnek:

class User {
    public function getRole() {
        return "User";
    }
}

class Admin extends User {
    public function getRole() {
        return "Admin";
    }
}

Burada Admin sınıfı getRole yöntemini geçersiz kılar. Normal bir Kullanıcı nesnesi Kullanıcıyı döndürürken, Yönetici nesnesi Yöneticiyi döndürür. Bu, farklı nesnelerin ortak bir yapıyı paylaşırken farklı tepkiler vermesini sağlar.

Ebeveyn Yöntemlerini Çağırma

Bazen bir alt sınıfın bir yöntemi özelleştirmesi gerekir ancak yine de ana yöntemin bir kısmını kullanması gerekir. Birçok programlama dili, alt sınıfın bir yöntemin ana sürümünü çağırmasına izin verir.

PHP’de bu, kullanılarak yapılabilir.ebeveyn::. Örneğin:

class User {
    public function getInfo() {
        return "Basic user information";
    }
}

class Admin extends User {
    public function getInfo() {
        return parent::getInfo() . " with admin permissions";
    }
}

Bu örnekte Admin sınıfı ana yöntemi tamamen göz ardı etmiyor. Ana getInfo yöntemini kullanır ve ekstra bilgi ekler. Bu, alt sınıfın mevcut davranışı tamamen değiştirmek yerine genişletmesi gerektiğinde kullanışlıdır.

Erişim Değiştiricileri ve Devralma

Erişim değiştiricileri, sınıf dışından veya alt sınıflardan hangi özelliklere ve yöntemlere erişilebileceğini kontrol eder. En yaygın erişim değiştiricileri şunlardır:kamu,korumalıveözel.

  • halka açıkÜyelere genellikle her yerden erişilebilir.

  • Korumalıüyelere genellikle sınıf içinden ve alt sınıfların içinden erişilebilir.

  • Özelüyelere genellikle yalnızca tanımlandıkları sınıfın içinden erişilebilir.

Kalıtımda, korunan üyeler özellikle kullanışlıdır çünkü alt sınıfların dahili ana verileri, bu verileri tamamen dış dünyaya açık hale getirmeden kullanmasına izin verirler.

Özel üyelere birçok dilde çocuk sınıflarında doğrudan erişilemez. Bu, dahili uygulama ayrıntılarının korunmasına yardımcı olur ve kapsüllemeyi destekler.

Miras Türleri

Farklı programlama dilleri farklı kalıtım türlerini destekler. En yaygın türtek miras, burada bir alt sınıf bir üst sınıftan miras alır.

Bazı yaygın kalıtım türleri şunlardır:

  • Tek miras:bir çocuk sınıfı bir ebeveyn sınıfından miras alır.

  • Çok düzeyli miras:Bir sınıf, bir alt sınıftan miras alarak bir miras zinciri oluşturur.

  • Hiyerarşik miras:birden fazla alt sınıf aynı üst sınıftan miras alır.

  • Çoklu kalıtım:bir sınıf birden fazla ebeveyn sınıftan miras alır. Bu, PHP ve Java sınıfları gibi bazı dillerde doğrudan desteklenmez.

Çoklu kalıtımın doğrudan desteklenmediği durumlarda bile diller, arayüzler veya özellikler gibi alternatifler sağlayabilir. Bu araçlar, çoklu mirasın bazı karmaşıklıklarından kaçınırken davranışın paylaşılmasına yardımcı olur.

Miras ve Kompozisyon

Miras faydalıdır ancak her ilişkide kullanılmamalıdır. Yazılım tasarımında yaygın bir soru, kalıtım mı yoksa kompozisyon mu kullanılacağıdır.

Miras bir temsil ederis-ailişki. Örneğin, Yönetici bir Kullanıcıdır ve Araba bir Araçtır. Kompozisyon bir temsil edervar-birilişki. Örneğin, bir Arabanın bir Motoru vardır ve bir Kullanıcının bir Profili vardır.

Eğer ilişki açıkça is-a ise miras uygun olabilir. Eğer ilişki has-a ise kompozisyon genellikle daha iyi bir seçimdir. Kalıtımın yanlış kullanılması sistemin anlaşılmasını zorlaştırabilir ve daha sonra değiştirilmesini daha zor hale getirebilir.

Gerçek Dünya Örneği

Çevrimiçi bir öğrenme platformu hayal edin. Platformda Öğrenci, Eğitmen ve Yönetici gibi farklı hesap türleri bulunabilir. Hepsi ad, e-posta, şifre ve oturum açma davranışı gibi temel hesap bilgilerini paylaşır.

Hesap adı verilen bir üst sınıf, paylaşılan verileri ve ortak yöntemleri içerebilir. Daha sonra Öğrenci, Eğitmen ve Yönetici Hesaptan devralabilir. Her alt sınıf kendi davranışını ekleyebilir:

  • Öğrenci derslere kayıt olabilir ve ödev verebilir.

  • Eğitmen dersler oluşturabilir ve gönderimleri inceleyebilir.

  • Yönetici, kullanıcıları yönetebilir ve platform ayarlarını kontrol edebilir.

Bu yapı, her hesap türünün kendi sorumluluklarına sahip olmasına olanak tanırken, ortak mantığı tek bir yerde tutar.

Mirasın Faydaları

Kalıtım, Object-Oriented Programming'da birkaç önemli avantaj sağlar:

  • Paylaşılan mantığı bir üst sınıfa taşıyarak kod tekrarını azaltır.

  • Ortak davranışların tek bir yerde güncellenebilmesi nedeniyle sürdürülebilirliği artırır.

  • Genel ve özel sınıflar arasında açık bir ilişki yaratır.

  • Yöntem geçersiz kılmayı destekleyerek alt sınıfların davranışı özelleştirmesine olanak tanır.

  • Düzenli ve ölçeklenebilir yazılım yapılarının oluşturulmasına yardımcı olur.

Bu faydalar, özellikle birkaç sınıfın ortak davranışı paylaştığı durumlarda, birçok gerçek yazılım projesinde kalıtımı yararlı kılar.

Kalıtım Kullanılırken Yaygın Hatalar

Kalıtım güçlü olmasına rağmen, yeni başlayanlar sıklıkla onu çok fazla kullanır veya yanlış yerlerde kullanırlar. Yaygın bir hata, sınıflar mantıksal olarak ilişkili olmasa bile, yalnızca kodu yeniden kullanmak için miras ilişkileri oluşturmaktır.

Bir diğer hata ise çok derin miras zincirleri oluşturmaktır. Bir sınıf başka bir sınıftan miras aldığında, o da başka bir sınıftan miras aldığında, kodu takip etmek zorlaşabilir. Derin miras, hata ayıklamayı ve bakımı zorlaştırabilir.

Üçüncü bir hata ise ebeveyn sınıfına çok fazla mantık yerleştirmektir. Ebeveyn sınıfı çok büyürse, alt sınıflar gerçekte ihtiyaç duymadıkları davranışları devralabilir. Bu, tasarımı daha az temiz ve daha az esnek hale getirebilir.

Miras Kullanımına İlişkin En İyi Uygulamalar

Kalıtımı etkili bir şekilde kullanmak için geliştiricilerin onu dikkatli bir şekilde ve yalnızca sınıflar arasındaki ilişki net olduğunda uygulaması gerekir.

Yararlı en iyi uygulamalar şunları içerir:

  • Gerçek bir olan-bir ilişkisi olduğunda kalıtımı kullanın.

  • Ebeveyn sınıflarını yalnızca paylaşılan davranışa odaklanın.

  • Çok derin miras zincirlerinden kaçının.

  • Korunan üyeleri dikkatli kullanın ve çok fazla dahili mantığı açığa çıkarmaktan kaçının.

  • İlişki is-a yerine has-a olduğunda kompozisyonu tercih edin.

  • Farklı sınıfların aynı ana sınıfı paylaşmadan aynı sözleşmeyi takip etmesi gerektiğinde arayüzleri kullanın.

Bu uygulamaları takip etmek, geliştiricilerin gereksiz karmaşıklık yaratmadan mirastan faydalanmasına yardımcı olur.

Modern Çerçevelerde Kalıtım

Kalıtım birçok modern programlama çerçevesinde kullanılır. Web geliştirmede geliştiriciler genellikle temel denetleyici sınıflarını, model sınıflarını veya hizmet sınıflarını genişletir. Örneğin bir denetleyici, paylaşılan istek işleme davranışını temel denetleyiciden devralabilir.

Laravel ve Symfony gibi PHP çerçevelerinde miras, denetleyicilerde, modellerde, form sınıflarında, komut sınıflarında ve test sınıflarında görünebilir. Bununla birlikte modern çerçeveler, mirasın aşırı kullanımını önlemek için kompozisyon, arayüzler, özellikler ve bağımlılık enjeksiyonunu da kullanır.

Bu, kalıtımı anlamanın önemli olduğu anlamına gelir, ancak geliştiricilerin aynı zamanda onu ne zaman kullanmamaları gerektiğini de öğrenmeleri gerekir. İyi yazılım tasarımı, problem için doğru aracın seçilmesine bağlıdır.

Sonuç

Kalıtım Object-Oriented Programming’in temel ilkesidir. Alt sınıfların ana sınıfların özelliklerini ve yöntemlerini yeniden kullanmasına ve genişletmesine olanak tanır. Bu, tekrarların azaltılmasına, ilgili sınıfların düzenlenmesine ve daha temiz yazılım yapıları oluşturulmasına yardımcı olur.

Ancak mirasın dikkatli kullanılması gerekir. Sınıflar arasında açık bir is-a ilişkisi olduğunda en iyi sonucu verir. Doğru kullanıldığında, kalıtım kodun bakımını, genişletilmesini ve anlaşılmasını kolaylaştırabilir.

Yeni başlayanlar için kalıtım, polimorfizm, soyutlama, arayüzler ve tasarım desenleri gibi daha gelişmiş OOP konularını anlamaya yönelik önemli bir adımdır. Kalıtım konusunda uzmanlaşmak, profesyonel nesne yönelimli kod yazmak için güçlü bir temel sağlar.