SAP ABAP - Kế thừa

Một trong những khái niệm quan trọng nhất trong lập trình hướng đối tượng là kế thừa. Tính kế thừa cho phép chúng ta xác định một lớp theo nghĩa của một lớp khác, điều này giúp tạo và duy trì một ứng dụng dễ dàng hơn. Điều này cũng tạo cơ hội để sử dụng lại chức năng mã và thời gian thực hiện nhanh chóng.

Khi tạo một lớp, thay vì viết các thành viên và phương thức dữ liệu hoàn toàn mới, lập trình viên có thể chỉ định rằng lớp mới sẽ kế thừa các thành viên của một lớp hiện có. Lớp hiện có này được gọi làbase class hoặc là super classvà lớp mới được gọi là derived class hoặc là sub class.

  • Một đối tượng của một lớp có thể thu được các thuộc tính của một lớp khác.

  • Lớp sinh kế thừa dữ liệu và phương thức của một siêu lớp. Tuy nhiên, chúng có thể ghi đè các phương thức và cũng có thể thêm các phương thức mới.

  • Ưu điểm chính của kế thừa là khả năng tái sử dụng.

Mối quan hệ kế thừa được chỉ định bằng cách sử dụng bổ sung 'INHERITING FROM' vào câu lệnh định nghĩa lớp.

Sau đây là cú pháp:

CLASS <subclass> DEFINITION INHERITING FROM <superclass>.

Thí dụ

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.

Đoạn mã trên tạo ra kết quả sau:

This is public data 
Method in child class 
This is public data

Kiểm soát truy cập và kế thừa

Một lớp dẫn xuất có thể truy cập tất cả các thành viên không riêng tư của lớp cơ sở của nó. Do đó, các thành viên siêu lớp không thể truy cập được vào các hàm thành viên của lớp con nên được khai báo là private trong siêu lớp. Chúng tôi có thể tóm tắt các kiểu truy cập khác nhau tùy theo người có thể truy cập chúng theo cách sau:

Truy cập Công cộng Được bảo vệ Riêng tư
Cùng một calss Đúng Đúng Đúng
Lớp có nguồn gốc Đúng Đúng Không
Ngoài lớp học Đúng Không Không

Khi dẫn xuất một lớp từ siêu lớp, nó có thể được kế thừa thông qua kế thừa công khai, bảo vệ hoặc tư nhân. Kiểu kế thừa được chỉ định bởi trình xác định truy cập như đã giải thích ở trên. Chúng tôi hầu như không sử dụng kế thừa được bảo vệ hoặc riêng tư, nhưng kế thừa công khai thường được sử dụng. Các quy tắc sau được áp dụng trong khi sử dụng các kiểu kế thừa khác nhau.

  • Public Inheritance- Khi dẫn xuất một lớp từ siêu lớp công khai, các thành viên công khai của siêu lớp trở thành thành viên công khai của lớp con và các thành viên được bảo vệ của siêu lớp trở thành thành viên được bảo vệ của lớp con. Các thành viên riêng của lớp siêu cấp không bao giờ có thể truy cập trực tiếp từ lớp con, nhưng có thể được truy cập thông qua các lệnh gọi công khai và các thành viên được bảo vệ của lớp siêu cấp.

  • Protected Inheritance - Khi xuất phát từ siêu lớp được bảo vệ, các thành viên công khai và được bảo vệ của siêu lớp trở thành thành viên được bảo vệ của lớp con.

  • Private Inheritance - Khi xuất phát từ siêu lớp riêng, các thành viên công khai và được bảo vệ của siêu lớp trở thành thành viên riêng của lớp con.

Định nghĩa lại các phương thức trong lớp con

Các phương thức của lớp siêu có thể được thực hiện lại trong lớp con. Một số quy tắc xác định lại các phương pháp -

  • Câu lệnh định nghĩa lại cho phương thức kế thừa phải nằm trong cùng phần với định nghĩa của phương thức gốc.

  • Nếu bạn xác định lại một phương thức, bạn không cần phải nhập lại giao diện của nó trong lớp con mà chỉ cần nhập tên của phương thức.

  • Trong phương thức được định nghĩa lại, bạn có thể truy cập các thành phần của lớp siêu trực tiếp bằng cách sử dụng siêu tham chiếu.

  • Siêu tham chiếu giả chỉ có thể được sử dụng trong các phương thức được xác định lại.

Thí dụ

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.

Sau khi thực hiện F8, nếu chúng ta nhập các giá trị 9 và 10, đoạn mã trên sẽ tạo ra kết quả sau:

Redefinition Demo 
29