SAP ABAP - Polimorfizm

Polimorfizm terimi, kelimenin tam anlamıyla 'birçok form' anlamına gelir. Nesne odaklı bir perspektiften, polimorfizm, bir miras ağacı içindeki çeşitli türlerin birbirinin yerine kullanılmasını mümkün kılmak için kalıtımla birlikte çalışır. Yani, polimorfizm, bir sınıf hiyerarşisi olduğunda ortaya çıkar ve kalıtımla ilişkilendirilir. ABAP polimorfizmi, bir yönteme yapılan bir çağrının, yöntemi çağıran nesnenin türüne bağlı olarak farklı bir yöntemin yürütülmesine neden olacağı anlamına gelir.

Aşağıdaki program soyut bir 'class_prgm' sınıfı, 2 alt sınıf (class_procedural ve class_OO) ve bir test sürücü sınıfı 'class_type_approach' içerir. Bu uygulamada, sınıf yöntemi 'start', programlama türünü ve yaklaşımını göstermemize izin verir. 'Start' yönteminin imzasına yakından bakarsanız, class_prgm türünde bir içe aktarım parametresi aldığını göreceksiniz. Bununla birlikte, Seçim Başlangıcı olayında, bu yöntem çalışma zamanında class_procedural ve class_OO türündeki nesnelerle çağrılmıştır.

Misal

Report ZPolymorphism1. 
CLASS class_prgm Definition Abstract. 
PUBLIC Section. 
Methods: prgm_type Abstract, 
approach1 Abstract. 
ENDCLASS. 

CLASS class_procedural Definition 
Inheriting From class_prgm. 
PUBLIC Section. 
Methods: prgm_type Redefinition, 
approach1 Redefinition. 
ENDCLASS. 

CLASS class_procedural Implementation. 
Method prgm_type. 
Write: 'Procedural programming'. 

EndMethod. Method approach1. 
Write: 'top-down approach'. 

EndMethod. ENDCLASS. 
CLASS class_OO Definition 
Inheriting From class_prgm. 
PUBLIC Section. 
Methods: prgm_type Redefinition, 
approach1 Redefinition. 
ENDCLASS. 

CLASS class_OO Implementation. 
Method prgm_type. 
Write: 'Object oriented programming'. 
EndMethod. 

Method approach1. 
Write: 'bottom-up approach'.
EndMethod. 
ENDCLASS. 

CLASS class_type_approach Definition. 
PUBLIC Section. 
CLASS-METHODS: 
start Importing class1_prgm 
Type Ref To class_prgm. 
ENDCLASS. 

CLASS class_type_approach IMPLEMENTATION. 
Method start. 
CALL Method class1_prgm→prgm_type. 
Write: 'follows'. 

CALL Method class1_prgm→approach1. 
EndMethod. 
ENDCLASS. 

Start-Of-Selection. 
Data: class_1 Type Ref To class_procedural, 
class_2 Type Ref To class_OO. 

Create Object class_1. 
Create Object class_2. 
CALL Method class_type_approach⇒start 
Exporting 

class1_prgm = class_1. 
New-Line. 
CALL Method class_type_approach⇒start 
Exporting 
class1_prgm = class_2.

Yukarıdaki kod aşağıdaki çıktıyı üretir -

Procedural programming follows top-down approach  
Object oriented programming follows bottom-up approach

ABAP çalışma zamanı ortamı, içe aktaran class1_prgm parametresinin atanması sırasında örtük bir daraltma çevirimi gerçekleştirir. Bu özellik, 'başlangıç' yönteminin jenerik olarak uygulanmasına yardımcı olur. Bir nesne referans değişkeni ile ilişkili dinamik tür bilgisi, ABAP çalışma zamanı ortamının, nesne referans değişkeni tarafından işaret edilen nesnede tanımlanan uygulama ile bir yöntem çağrısını dinamik olarak bağlamasına izin verir. Örneğin, 'class_type_approach' sınıfındaki 'start' yöntemi için içe aktarma parametresi 'class1_prgm', kendi başına asla somutlaştırılamayan soyut bir türü ifade eder.

Yöntem, class_procedural veya class_OO gibi somut bir alt sınıf uygulamasıyla çağrıldığında, class1_prgm referans parametresinin dinamik türü bu somut türlerden birine bağlanır. Bu nedenle, 'prgm_type' ve 'yaklaşım1' yöntemlerine yapılan çağrılar, 'class_prgm' sınıfında sağlanan tanımlanmamış soyut uygulamalar yerine class_procedural veya class_OO alt sınıflarında sağlanan uygulamaları ifade eder.