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