Makalemizde ABAP-OO Inheritance konusunu işleyeceğiz. Inheritance nedir? Türkçe karşılığı “Kalıtım” diye geçiyor ancak bu tarz teknik konularda terminolojik olarak tek bir dil kullanılması taraftarıyım çünkü teknik konuların diğer dillerdeki karşılığı tam olarak aynı anlamı karşılamıyor. Yine de Türkçesini yazmış olalım. Ancak ben yazıda “Inheritance” diye bahsedeceğim.

Amaç

Inheritance, nesne yönelimli programlama dillerinin en temel özelliklerinden birisidir. Bir sınıftaki özellikleri veya fonksiyonları direk olarak başka bir sınıfa aktarmak istediğimizde kullanmamız gerekir. Bu özellik bizlere hem merkezi bir yönetim yapmamızı sağlarken aynı zamanda katmanlı mimari yaratmamıza da yardımcı oluyor.


Senaryo

Kısa bir senaryo oluşturacak olursak; bir şirketin insan kaynaklarıyla ilgili bir modül geliştiriyorsunuz. Tüm şirket için çalışanlarınız ve yöneticileriniz var. Bu kimliklerin karşılığı genel iş süreçlerinizde belli özellikleri kapsamaktadır. Çalışanların sahip olduğu özellikler, imkanlar veya yapılan hesaplamalar yöneticilerinden farklı şekillerde gelişebilir. Ancak şöyle bir durum var ki her bir yönetici, çalışanların sahip olduğu özelliklere sahip olmalıdır. Sonuçta her bir yönetici aynı zamanda şirketler için birer çalışandır.

Bu senaryo ile birlikte aşağıdaki basit programı yazdım. Çok fazla özellik ekleyerek kodu uzatıp karmaşık hale getirmek istemedim. En temel hatlarıyla Inheritance kullanımını aşağıdaki kodda görebilirsiniz.


ABAP Kodu

[ABAP]
************************************************************************
* ABAP Development
*
* Author : Barış Arslan
* Description : Inheritance
************************************************************************

” Her bir yönetici aynı zamanda bir çalışandır.
” Bu yüzden çalışan sınıfındaki tüm özellikleri yönetici
” sınıfına da aktarabilmemiz gerekiyor.

” Çalışan sınıfımız
CLASS lcl_employee DEFINITION.
  PUBLIC SECTION.
    DATA : v_name       TYPE char20     ” Çalışanın adı
         , v_department TYPE char20     ” Çalışanın departmanı
         , v_dob        TYPE sy-datum   ” Çalışanın doğum tarihi
         .

    METHODS : get_age RETURNING VALUE(rv_age) TYPE int4   ” Çalışanın yaşını hesaplayan metot
            .
ENDCLASS.

CLASS lcl_employee IMPLEMENTATION.
  METHOD get_age.
    ” Çalışınımızın doğum tarihi üzerinden yaşını hesaplayan metot
    rv_age = sy-datum+0(4) – me->v_dob+0(4).
  ENDMETHOD.
ENDCLASS.

” Yönetici sınıfımız
CLASS lcl_manager DEFINITION INHERITING FROM lcl_employee.
  ” Herhangi bir class için metot belirlemediyseniz
  ” CLASS IMPLEMENTATION yapmak zorunda değilsiniz.

  ” Employee sınıfından Inherit edildiği için
  ” Employee sınıfına ait özelliklere bu sınıfın içerisinde
  ” erişim sağlayabilirsiniz.

  ” Visibility kurallarını unutmayın. Hangi SECTION
  ” içerisinde tanımlandığına göre buradan erişim sağlama
  ” durumunuz kısıtlanabilir.

  ” Örneğin EMPLOYEE sınıfında PRIVATE olarak tanımlanan
  ” bir özelliğe veya metoda buradan erişemezsiniz.

  PUBLIC SECTION.
    ” Eğer yönetici sınıfımız için ayrıca eklememiz gereken
    ” özellikler veya metodlar varsa bu sınıfın içerisinde eklenebilir.

    DATA : v_room_id TYPE char3   ” Yöneticinin oda numarası
         .
ENDCLASS.

START-OF-SELECTION.
  DATA : go_personal TYPE REF TO lcl_employee
       , go_manager  TYPE REF TO lcl_manager
       .

  DATA : gv_emp_age TYPE int4
       , gv_mng_age TYPE int4
       .

  ” Çalışanımız için referans nesne yaratıyoruz
  CREATE OBJECT go_personal.

  go_personal->v_name       = ‘Emre Kapı’.
  go_personal->v_department = ‘İnsan Kaynakları’.
  go_personal->v_dob        = ‘19831010’.

  gv_emp_age = go_personal->get_age( ).

  ” Çalışan bilgilerini yazdırıyoruz
  WRITE : ‘Çalışan  : ‘
        , go_personal->v_name
        , go_personal->v_department
        , gv_emp_age
        .

  ” Yöneticimiz için referans nesne yaratıyoruz
  CREATE OBJECT go_manager.
  
  ” Gördüğünüz gibi bu noktada yönetici sınıfında
  ” tanımlamadığımız ama çalışan sınıfımızdan
  ” Inheritance ile gelen özelliklere erişim sağlayabiliyoruz.
  go_manager->v_name       = ‘Özgür Küçük’.
  go_manager->v_department = ‘İnsan Kaynakları’.
  go_manager->v_dob        = ‘19681212’.

  gv_mng_age = go_manager->get_age( ).

  ” Çalışan bilgilerini yazdırıyoruz
  WRITE : / ‘Yönetici : ‘
        , go_manager->v_name
        , go_manager->v_department
        , gv_mng_age
        .
[/ABAP]


Programın Çıktısı

ABAP-OO Inheritance
ABAP-OO Inheritance


Notlar

Class nesnelerinin, özelliklerinin veya metodlarının “Visibility” durumunu unutmayın. Inheritance için İlgili sınıfın değişkenlerinin hangi SECTION içerisinde tanımlandığı çok önemlidir. Aksi takdirde tanımlamalarınızı yapsanız dahi alt sınıfınızdan erişememe durumunuz oluşur. Bu özellik ise farklı amaçlar için kullanılmaktadır, eğer sınıfınızın tüm özelliklerini dışarıya açmak istemiyorsanız kısıtlamalar getirebiliyorsunuz.