SAP ABAP - มรดก

แนวคิดที่สำคัญที่สุดอย่างหนึ่งในการเขียนโปรแกรมเชิงวัตถุคือการถ่ายทอดทางพันธุกรรม การสืบทอดช่วยให้เรากำหนดคลาสในรูปแบบของคลาสอื่นซึ่งทำให้ง่ายต่อการสร้างและดูแลแอปพลิเคชัน นอกจากนี้ยังให้โอกาสในการนำฟังก์ชันโค้ดกลับมาใช้ซ้ำและเวลาในการใช้งานที่รวดเร็ว

เมื่อสร้างคลาสแทนที่จะเขียนสมาชิกข้อมูลและเมธอดใหม่ทั้งหมดโปรแกรมเมอร์สามารถกำหนดได้ว่าคลาสใหม่ควรสืบทอดสมาชิกของคลาสที่มีอยู่ คลาสที่มีอยู่นี้เรียกว่าbase class หรือ super classและคลาสใหม่เรียกว่า derived class หรือ sub class.

  • ออบเจ็กต์ของคลาสหนึ่งสามารถรับคุณสมบัติของคลาสอื่นได้

  • คลาสที่ได้รับสืบทอดข้อมูลและวิธีการของซูเปอร์คลาส อย่างไรก็ตามสามารถเขียนทับเมธอดและเพิ่มเมธอดใหม่ได้

  • ประโยชน์หลักของการถ่ายทอดทางพันธุกรรมคือการนำกลับมาใช้ใหม่ได้

ความสัมพันธ์ของการสืบทอดถูกระบุโดยใช้การเพิ่ม 'INHERITING FROM' ในคำสั่งนิยามคลาส

ต่อไปนี้เป็นไวยากรณ์ -

CLASS <subclass> DEFINITION INHERITING FROM <superclass>.

ตัวอย่าง

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.

รหัสด้านบนสร้างผลลัพธ์ต่อไปนี้ -

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

การควบคุมการเข้าถึงและการสืบทอด

คลาสที่ได้รับสามารถเข้าถึงสมาชิกที่ไม่ใช่ส่วนตัวทั้งหมดของคลาสพื้นฐานได้ ดังนั้นสมาชิกระดับซูเปอร์คลาสที่ไม่ควรเข้าถึงฟังก์ชันสมาชิกของคลาสย่อยควรถูกประกาศให้เป็นส่วนตัวในซูเปอร์คลาส เราสามารถสรุปประเภทการเข้าถึงต่างๆตามผู้ที่สามารถเข้าถึงได้ด้วยวิธีต่อไปนี้ -

เข้าไป สาธารณะ มีการป้องกัน เอกชน
calss เดียวกัน ใช่ ใช่ ใช่
คลาสที่ได้รับ ใช่ ใช่ ไม่
นอกชั้นเรียน ใช่ ไม่ ไม่

เมื่อได้รับคลาสจากซูเปอร์คลาสคลาสนั้นสามารถสืบทอดผ่านการสืบทอดแบบสาธารณะการป้องกันหรือแบบส่วนตัว ประเภทของการสืบทอดถูกระบุโดยตัวระบุการเข้าถึงตามที่อธิบายไว้ข้างต้น เราแทบจะไม่ใช้มรดกที่ได้รับการคุ้มครองหรือมรดกส่วนตัว แต่มักใช้มรดกสาธารณะ กฎต่อไปนี้ถูกนำไปใช้ในขณะที่ใช้การสืบทอดประเภทต่างๆ

  • Public Inheritance- เมื่อได้รับคลาสจากคลาสซูเปอร์สาธารณะสมาชิกสาธารณะของคลาสซุปเปอร์จะกลายเป็นสมาชิกสาธารณะของคลาสย่อยและสมาชิกที่ได้รับการปกป้องของคลาสซูเปอร์จะกลายเป็นสมาชิกที่ได้รับการคุ้มครองของคลาสย่อย สมาชิกส่วนตัวของ Super class จะไม่สามารถเข้าถึงได้โดยตรงจากคลาสย่อย แต่สามารถเข้าถึงได้ผ่านการโทรไปยังสาธารณะและสมาชิกที่ได้รับการป้องกันของคลาสระดับสูง

  • Protected Inheritance - เมื่อได้รับมาจากคลาสซุปเปอร์ที่ได้รับการป้องกันสมาชิกสาธารณะและที่ได้รับการปกป้องของคลาสซุปเปอร์จะกลายเป็นสมาชิกที่ได้รับการคุ้มครองของคลาสย่อย

  • Private Inheritance - เมื่อได้มาจากซูเปอร์คลาสส่วนตัวสมาชิกสาธารณะและที่ได้รับการคุ้มครองของคลาสซุปเปอร์จะกลายเป็นสมาชิกส่วนตัวของคลาสย่อย

การกำหนดวิธีการใหม่ในคลาสย่อย

วิธีการของซุปเปอร์คลาสสามารถนำมาใช้ใหม่ในคลาสย่อยได้ กฎบางประการในการกำหนดวิธีการใหม่ -

  • คำสั่งนิยามใหม่สำหรับวิธีการสืบทอดต้องอยู่ในส่วนเดียวกันกับคำจำกัดความของวิธีการดั้งเดิม

  • หากคุณกำหนดเมธอดใหม่คุณไม่จำเป็นต้องป้อนอินเทอร์เฟซของมันอีกครั้งในคลาสย่อย แต่จะระบุเฉพาะชื่อของเมธอดเท่านั้น

  • ภายในวิธีการที่กำหนดใหม่คุณสามารถเข้าถึงส่วนประกอบของซูเปอร์คลาสโดยตรงโดยใช้การอ้างอิงขั้นสูง

  • ซูเปอร์อ้างอิงหลอกสามารถใช้ได้ในวิธีการที่กำหนดใหม่เท่านั้น

ตัวอย่าง

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 หากเราป้อนค่า 9 และ 10 โค้ดด้านบนจะสร้างผลลัพธ์ต่อไปนี้ -

Redefinition Demo 
29