SAP ABAP - Devralma
Nesne yönelimli programlamadaki en önemli kavramlardan biri kalıtımdır. Kalıtım, bir sınıfı başka bir sınıf açısından tanımlamamıza izin verir, bu da bir uygulama oluşturmayı ve sürdürmeyi kolaylaştırır. Bu aynı zamanda kod işlevselliğini yeniden kullanma ve hızlı uygulama süresi için bir fırsat sağlar.
Bir sınıf oluştururken, tamamen yeni veri üyeleri ve yöntemler yazmak yerine, programcı yeni sınıfın mevcut bir sınıfın üyelerini miras alması gerektiğini belirleyebilir. Bu mevcut sınıfabase class veya super classve yeni sınıfa, derived class veya sub class.
Bir sınıfın bir nesnesi başka bir sınıfın özelliklerini edinebilir.
Türetilmiş sınıf, bir süper sınıfın verilerini ve yöntemlerini miras alır. Ancak, yöntemlerin üzerine yazabilir ve ayrıca yeni yöntemler ekleyebilirler.
Mirasın temel avantajı yeniden kullanılabilirliktir.
Kalıtım ilişkisi, sınıf tanımı ifadesine 'INHERITING FROM' eki kullanılarak belirtilir.
Sözdizimi aşağıdadır -
CLASS <subclass> DEFINITION INHERITING FROM <superclass>.
Misal
Report ZINHERITAN_1.
CLASS Parent Definition.
PUBLIC Section.
Data: w_public(25) Value 'This is public data'.
Methods: ParentM.
ENDCLASS.
CLASS Child Definition Inheriting From Parent.
PUBLIC Section.
Methods: ChildM.
ENDCLASS.
CLASS Parent Implementation.
Method ParentM.
Write /: w_public.
EndMethod. ENDCLASS.
CLASS Child Implementation.
Method ChildM.
Skip.
Write /: 'Method in child class', w_public.
EndMethod.
ENDCLASS.
Start-of-selection.
Data: Parent Type Ref To Parent,
Child Type Ref To Child.
Create Object: Parent, Child.
Call Method: Parent→ParentM,
child→ChildM.
Yukarıdaki kod aşağıdaki çıktıyı üretir -
This is public data
Method in child class
This is public data
Erişim Kontrolü ve Kalıtım
Türetilmiş bir sınıf, temel sınıfının özel olmayan tüm üyelerine erişebilir. Bu nedenle, alt sınıfların üye işlevlerine erişilememesi gereken süper sınıf üyeleri, süper sınıfta özel olarak ilan edilmelidir. Farklı erişim türlerini, bunlara kimin erişebileceğine göre aşağıdaki şekilde özetleyebiliriz -
Giriş | halka açık | Korumalı | Özel |
---|---|---|---|
Aynı kaloriler | Evet | Evet | Evet |
Türetilmiş sınıf | Evet | Evet | Hayır |
Sınıf dışı | Evet | Hayır | Hayır |
Bir süper sınıftan bir sınıf türetilirken, genel, korumalı veya özel miras yoluyla miras alınabilir. Devralma türü, yukarıda açıklandığı gibi erişim belirticisi tarafından belirlenir. Korunan veya özel mirası neredeyse hiç kullanmayız, ancak genel olarak kamu mirası kullanılır. Farklı miras türleri kullanılırken aşağıdaki kurallar uygulanır.
Public Inheritance- Bir kamu süper sınıfından bir sınıf türetilirken, süper sınıfın genel üyeleri alt sınıfın genel üyeleri olur ve süper sınıfın korunan üyeleri, alt sınıfın korumalı üyeleri olur. Süper sınıfın özel üyelerine hiçbir zaman doğrudan bir alt sınıftan erişilemez, ancak süper sınıfın herkese açık ve korumalı üyelerine yapılan çağrılar yoluyla erişilebilir.
Protected Inheritance - Korumalı bir süper sınıftan türetildiğinde, süper sınıfın genel ve korumalı üyeleri, alt sınıfın korumalı üyeleri haline gelir.
Private Inheritance - Özel bir süper sınıftan türetildiğinde, süper sınıfın kamu ve korumalı üyeleri, alt sınıfın özel üyeleri olur.
Alt Sınıfta Yöntemleri Yeniden Tanımlama
Süper sınıfın yöntemleri alt sınıfta yeniden uygulanabilir. Yöntemleri yeniden tanımlamanın birkaç kuralı -
Miras alınan yöntemin yeniden tanımlama ifadesi, orijinal yöntemin tanımıyla aynı bölümde yer almalıdır.
Bir yöntemi yeniden tanımlarsanız, ara yüzünü tekrar alt sınıfa girmeniz gerekmez, yalnızca yöntemin adını girmeniz gerekir.
Yeniden tanımlanan yöntem içinde, süper referansı kullanarak doğrudan süper sınıfın bileşenlerine erişebilirsiniz.
Sözde referans süper, yalnızca yeniden tanımlanmış yöntemlerde kullanılabilir.
Misal
Report Zinheri_Redefine.
CLASS super_class Definition.
Public Section.
Methods: Addition1 importing g_a TYPE I
g_b TYPE I
exporting g_c TYPE I.
ENDCLASS.
CLASS super_class Implementation.
Method Addition1.
g_c = g_a + g_b.
EndMethod.
ENDCLASS.
CLASS sub_class Definition Inheriting From super_class.
Public Section.
METHODS: Addition1 Redefinition.
ENDCLASS.
CLASS sub_class Implementation.
Method Addition1.
g_c = g_a + g_b + 10.
EndMethod.
ENDCLASS.
Start-Of-Selection.
Parameters: P_a Type I, P_b TYPE I.
Data: H_Addition1 TYPE I.
Data: H_Sub TYPE I.
Data: Ref1 TYPE Ref TO sub_class.
Create Object Ref1.
Call Method Ref1→Addition1 exporting g_a = P_a
g_b = P_b
Importing g_c = H_Addition1.
Write:/ H_Addition1.
F8'i çalıştırdıktan sonra, 9 ve 10 değerlerini girersek, yukarıdaki kod aşağıdaki çıktıyı üretir -
Redefinition Demo
29