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ı
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.