ในกระบวนการใช้ DELPHI เพื่อพัฒนาซอฟต์แวร์ เราเป็นเหมือนกลุ่มวัวและแกะที่มีความสุขบนทุ่งหญ้า เพลิดเพลินกับแสงแดดที่ส่งมาให้เราอย่างอิสระด้วยภาษา Object Pascal และพืชน้ำอันอุดมสมบูรณ์ที่จัดทำโดยตัวควบคุม VCL ต่างๆ มองขึ้นไปบนท้องฟ้าสีครามอันไร้ขอบเขต มองลงไปที่หญ้าอันเขียวขจีบนพื้นโลก ใครจะนึกถึงจักรวาลที่ใหญ่โต และสิ่งใดที่เล็กกว่าโมเลกุลและอะตอม? นั่นเป็นเรื่องของนักปรัชญา ขณะนั้นนักปราชญ์นั่งอยู่บนยอดเขาสูง มองดูความเปลี่ยนแปลงของเนบิวลาแห่งจักรวาล จ้องมองแมลงคลานบนพื้นดิน จู่ๆ ก็หันกลับมาพยักหน้าและยิ้มให้กับฝูงสัตว์กินหญ้าของเรา วัวและแกะ เขาหยิบหญ้าชิ้นหนึ่งใส่ปากเบา ๆ หลับตาแล้วชิมอย่างระมัดระวัง ฉันสงสัยว่าหญ้าชิ้นนี้อยู่ในปากของปราชญ์ว่าอะไร? อย่างไรก็ตาม เขามักจะมีรอยยิ้มที่น่าพอใจบนใบหน้าของเขาเสมอ
การรู้และทำความเข้าใจโลกอะตอมระดับจุลทรรศน์ของ DELPHI สามารถช่วยให้เราเข้าใจโครงสร้างการใช้งานระดับมหภาคของ DELPHI ได้อย่างถ่องแท้ ซึ่งจะเป็นการพัฒนาซอฟต์แวร์ของเราในพื้นที่อุดมการณ์ที่กว้างขึ้น มันเหมือนกับว่านิวตันค้นพบการเคลื่อนที่ของวัตถุขนาดมหึมา แต่ก็ประสบปัญหาเพราะเขาไม่รู้ว่าเหตุใดวัตถุจึงเคลื่อนที่เช่นนี้ ในทางกลับกัน ไอน์สไตน์ประสบกับชีวิตที่มีความสุขของทฤษฎีสัมพัทธภาพระหว่างกฎของอนุภาคพื้นฐานกับการเคลื่อนที่ของวัตถุขนาดมหึมา !
ส่วนที่ 1 ถึงวัตถุอะตอม
TObject คืออะไร?
เป็นแกนหลักของสถาปัตยกรรมภาษา Object Pascal และเป็นที่มาของการควบคุม VCL ต่างๆ เราสามารถมอง TObject เป็นหนึ่งในอะตอมที่ประกอบขึ้นเป็นแอปพลิเคชัน DELPHI แน่นอนว่าพวกมันประกอบด้วยอนุภาคที่ละเอียดกว่า เช่น องค์ประกอบไวยากรณ์ Pascal พื้นฐาน
กล่าวกันว่า TObject เป็นอะตอมของโปรแกรม DELPHI เนื่องจาก TObject ได้รับการสนับสนุนภายในโดยคอมไพเลอร์ DELPHI คลาสอ็อบเจ็กต์ทั้งหมดได้มาจาก TObject แม้ว่าคุณจะไม่ได้ระบุ TObject เป็นคลาสระดับบนสุดก็ตาม TObject ถูกกำหนดไว้ในหน่วยระบบซึ่งเป็นส่วนหนึ่งของระบบ ที่จุดเริ่มต้นของหน่วย System.pas มีข้อความแสดงความคิดเห็นนี้:
{ค่าคงที่ที่กำหนดไว้ล่วงหน้า ประเภท ขั้นตอน }
{ และฟังก์ชัน (เช่น True, Integer หรือ }
{Writeln) ไม่มีการประกาศจริง}
{ แต่กลับถูกสร้างไว้ในคอมไพเลอร์แทน }
{ และได้รับการปฏิบัติเหมือนมีการประกาศ }
{ ที่จุดเริ่มต้นของหน่วยระบบ}
หมายความว่าหน่วยนี้มีค่าคงที่ ประเภท ขั้นตอน และฟังก์ชันที่กำหนดไว้ล่วงหน้า (เช่น: True, Integer หรือ Writeln) สิ่งเหล่านี้ไม่ได้ประกาศไว้จริง ๆ แต่คอมไพเลอร์มีอยู่ในตัวและถูกใช้เมื่อเริ่มต้นการคอมไพล์ เป็นคำจำกัดความที่กำหนดไว้ คุณสามารถเพิ่มไฟล์ซอร์สโปรแกรมอื่นๆ เช่น Classes.pas หรือ Windows.pas ลงในไฟล์โปรเจ็กต์ของคุณเพื่อคอมไพล์และดีบักซอร์สโค้ด แต่คุณไม่สามารถเพิ่มไฟล์โปรแกรมซอร์ส System.pas ลงในไฟล์โปรเจ็กต์ของคุณเพื่อคอมไพล์ได้อย่างแน่นอน! DELPHI จะรายงานข้อผิดพลาดในการคอมไพล์สำหรับคำจำกัดความที่ซ้ำกันของระบบ!
ดังนั้น TObject จึงเป็นคำจำกัดความที่คอมไพเลอร์กำหนดไว้เป็นการภายใน สำหรับพวกเราที่ใช้ DELPHI ในการพัฒนาโปรแกรม TObject ถือเป็นอะตอม
คำจำกัดความของ TObject ในหน่วยระบบเป็นดังนี้:
TObject = คลาส
ตัวสร้าง สร้าง;
ขั้นตอน ฟรี;
ฟังก์ชั่นคลาส InitInstance (อินสแตนซ์: ตัวชี้): TObject;
ขั้นตอน CleanupInstance;
ฟังก์ชั่น ClassType: TClass;
ฟังก์ชั่นคลาส ClassName: ShortString;
ฟังก์ชั่นคลาส ClassNameIs (ชื่อ const: สตริง): บูลีน;
ฟังก์ชั่นคลาส ClassParent: TClass;
ฟังก์ชั่นคลาส ClassInfo: ตัวชี้;
ฟังก์ชั่นคลาส InstanceSize: Longint;
ฟังก์ชั่นคลาส InheritsFrom (AClass: TClass): บูลีน;
ฟังก์ชั่นคลาส MethodAddress (ชื่อ const: ShortString): ตัวชี้;
ฟังก์ชั่นคลาส MethodName (ที่อยู่: ตัวชี้): ShortString;
ฟังก์ชั่น FieldAddress (ชื่อ const: ShortString): ตัวชี้;
ฟังก์ชั่น GetInterface (const IID: TGUID; ออก Obj): บูลีน;
ฟังก์ชันคลาส GetInterfaceEntry (const IID: TGUID): PInterfaceEntry;
ฟังก์ชันคลาส GetInterfaceTable: PInterfaceTable;
ฟังก์ชั่น SafeCallException (ExceptObject: TObject;
ยกเว้นAddr: ตัวชี้): HResult เสมือน;
ขั้นตอนหลังการก่อสร้างเสมือน;
ขั้นตอนก่อนการทำลายล้าง;
ขั้นตอนการจัดส่ง (ข้อความ var);
ขั้นตอน DefaultHandler (ข้อความ var);
ฟังก์ชันคลาส NewInstance: TObject เสมือน;
ขั้นตอน FreeInstance เสมือน;
destructor ทำลายเสมือน;
จบ;
ต่อไปเราจะค่อยๆ เคาะประตูอะตอมของ TObject เพื่อดูว่าภายในมีโครงสร้างอะไร
เรารู้ว่า TObject เป็นคลาสพื้นฐานของวัตถุทั้งหมด แล้ววัตถุคืออะไรกันแน่?
วัตถุใดๆ ใน DELPHI เป็นตัวชี้ ซึ่งระบุพื้นที่ที่วัตถุครอบครองในหน่วยความจำ! แม้ว่าวัตถุจะเป็นพอยน์เตอร์ แต่เมื่อเราอ้างถึงสมาชิกของวัตถุ เราไม่จำเป็นต้องเขียนโค้ด MyObject^.GetName แต่สามารถเขียนได้เฉพาะ MyObject.GetName เท่านั้น นี่คือไวยากรณ์แบบขยายของภาษา Object Pascal และเป็น รองรับโดยคอมไพเลอร์ เพื่อนที่ใช้ C++ Builder มีความชัดเจนมากเกี่ยวกับความสัมพันธ์ระหว่างอ็อบเจ็กต์และพอยน์เตอร์ เนื่องจากอ็อบเจ็กต์ใน C++ Builder ต้องถูกกำหนดให้เป็นตัวชี้ สถานที่ที่ตัวชี้วัตถุชี้คือพื้นที่วัตถุที่วัตถุเก็บข้อมูล มาวิเคราะห์โครงสร้างข้อมูลของพื้นที่หน่วยความจำที่ชี้โดยตัวชี้วัตถุ
4 ไบต์แรกของพื้นที่อ็อบเจ็กต์ชี้ไปที่ตารางที่อยู่เมธอดเสมือน (VMT?C Virtual Method Table) ของคลาสอ็อบเจ็กต์ ช่องว่างถัดไปคือช่องว่างสำหรับจัดเก็บข้อมูลสมาชิกของออบเจ็กต์เอง และถูกจัดเก็บในลำดับทั้งหมดตั้งแต่สมาชิกข้อมูลของคลาสบรรพบุรุษดั้งเดิมที่สุดของออบเจ็กต์ไปจนถึงสมาชิกข้อมูลของคลาสอ็อบเจ็กต์ และในลำดับที่ สมาชิกข้อมูลถูกกำหนดไว้ในแต่ละระดับของชั้นเรียน
ตารางเมธอดเสมือนของคลาส (VMT) เก็บที่อยู่โพรซีเดอร์ของเมธอดเสมือนของคลาสทั้งหมดที่ได้รับมาจากคลาสบรรพบุรุษดั้งเดิมของคลาส วิธีการเสมือนของคลาสเป็นวิธีการประกาศด้วยคำสงวน วิธีการเสมือนเป็นกลไกพื้นฐานในการบรรลุความหลากหลายของวัตถุ แม้ว่าวิธีการแบบไดนามิกที่ประกาศด้วยคำสงวนแบบไดนามิกยังสามารถบรรลุความหลากหลายของวัตถุได้ วิธีการดังกล่าวจะไม่ถูกเก็บไว้ในตารางที่อยู่วิธีการเสมือน (VMT) มันเป็นเพียงวิธีการอื่นที่จัดทำโดย Object Pascal ที่สามารถประหยัดพื้นที่การจัดเก็บคลาส แต่ต้องแลกกับความเร็วในการโทร
แม้ว่าเราจะไม่ได้กำหนดวิธีการเสมือนของคลาสเอง แต่ออบเจ็กต์ของคลาสยังคงมีตัวชี้ไปยังตารางที่อยู่ของวิธีการเสมือน แต่ความยาวของรายการที่อยู่จะเป็นศูนย์ อย่างไรก็ตาม วิธีการเสมือนที่กำหนดไว้ใน TObject เช่น Destroy, FreeInstance ฯลฯ จะถูกเก็บไว้ที่ใด ปรากฎว่าที่อยู่วิธีการของพวกเขาถูกจัดเก็บไว้ในช่องว่างชดเชยในทิศทางลบที่สัมพันธ์กับตัวชี้ VMT ในความเป็นจริง พื้นที่ข้อมูลชดเชย 76 ไบต์ในทิศทางลบของตาราง VMT คือโครงสร้างข้อมูลระบบของคลาสอ็อบเจ็กต์ โครงสร้างข้อมูลเหล่านี้เกี่ยวข้องกับคอมไพเลอร์และอาจมีการเปลี่ยนแปลงในเวอร์ชัน DELPHI ในอนาคต
ดังนั้นคุณจึงคิดว่า VMT เป็นโครงสร้างข้อมูลที่เริ่มต้นจากพื้นที่ข้อมูลออฟเซ็ตเชิงลบคือพื้นที่ข้อมูลระบบของ VMT และข้อมูลออฟเซ็ตเชิงบวกของ VMT คือพื้นที่ข้อมูลผู้ใช้ (วิธีการเสมือนที่กำหนดเอง) ตารางที่อยู่) ฟังก์ชั่นและขั้นตอนที่เกี่ยวข้องกับข้อมูลคลาสหรือข้อมูลรันไทม์ของวัตถุที่กำหนดใน TObject โดยทั่วไปจะเกี่ยวข้องกับข้อมูลระบบของ VMT
ข้อมูล VMT แสดงถึงคลาส อันที่จริง VMT ก็คือคลาส! ใน Object Pascal เราใช้ตัวระบุ เช่น TObject, TComponent ฯลฯ เพื่อแสดงคลาสซึ่งนำไปใช้เป็นข้อมูล VMT ตามลำดับภายใน DELPHI จริงๆ แล้วประเภทของคลาสที่กำหนดด้วยคลาสของคำสงวนนั้นเป็นตัวชี้ไปยังข้อมูล VMT ที่เกี่ยวข้อง
สำหรับแอปพลิเคชันของเรา ข้อมูล VMT จะเป็นข้อมูลคงที่ หลังจากที่คอมไพเลอร์รวบรวมแอปพลิเคชันของเราแล้ว ข้อมูลนี้จะถูกกำหนดและเตรียมใช้งาน คำสั่งโปรแกรมที่เราเขียนสามารถเข้าถึงข้อมูลที่เกี่ยวข้องกับ VMT รับข้อมูล เช่น ขนาดของอ็อบเจ็กต์ ชื่อคลาส หรือข้อมูลแอตทริบิวต์รันไทม์ หรือการเรียกเมธอดเสมือน หรืออ่านชื่อและที่อยู่ของเมธอด เป็นต้น
เมื่อวัตถุถูกสร้างขึ้น ระบบจะจัดสรรพื้นที่หน่วยความจำสำหรับวัตถุและเชื่อมโยงวัตถุกับคลาสที่เกี่ยวข้อง ดังนั้น 4 ไบต์แรกในพื้นที่ข้อมูลที่จัดสรรสำหรับวัตถุจะกลายเป็นตัวชี้ไปยังข้อมูลคลาส VMT
มาดูกันว่าวัตถุเกิดและตายอย่างไร การได้เห็นลูกชายวัย 3 ขวบของฉันกระโดดไปมาบนพื้นหญ้า เพราะฉันได้เห็นกระบวนการกำเนิดของชีวิตจึงเข้าใจความหมายและความยิ่งใหญ่ของชีวิตได้อย่างแท้จริง เฉพาะผู้ที่มีประสบการณ์ความตายเท่านั้นที่จะเข้าใจและทะนุถนอมชีวิตมากขึ้น เอาล่ะเรามาทำความเข้าใจกระบวนการสร้างและทำลายวัตถุกันดีกว่า!
เราทุกคนรู้ดีว่าวัตถุที่ง่ายที่สุดสามารถสร้างขึ้นได้โดยใช้คำสั่งต่อไปนี้:
AnObject := TObject.Create;
คอมไพเลอร์ดำเนินการคอมไพล์เป็น:
ขึ้นอยู่กับ VMT ที่สอดคล้องกับ TObject ให้เรียกตัวสร้างการสร้างของ TObject ตัวสร้าง Create เรียกกระบวนการ ClassCreate ของระบบ และกระบวนการ ClassCreate ของระบบเรียกเมธอดเสมือน NewInstance ผ่านคลาส VMT ที่จัดเก็บไว้ในนั้น วัตถุประสงค์ของการเรียกเมธอด NewInstance คือการสร้างพื้นที่อินสแตนซ์ของออบเจ็กต์ เนื่องจากเราไม่ได้ใช้งานเมธอดนี้มากเกินไป จึงเป็น NewInstance ของคลาส TObject เมธอด NewInstance ของคลาส TObjec จะเรียกขั้นตอน GetMem เพื่อจัดสรรหน่วยความจำสำหรับออบเจ็กต์ตามขนาดอินสแตนซ์ของออบเจ็กต์ (InstanceSize) ที่เตรียมใช้งานโดยคอมไพเลอร์ในตาราง VMT จากนั้นเรียกเมธอด InitInstance เพื่อเตรียมใช้งานพื้นที่ที่จัดสรร ในขั้นแรกเมธอด InitInstance จะเตรียมใช้งานพื้นที่อ็อบเจ็กต์ 4 ไบต์แรกโดยเป็นตัวชี้ไปยัง VMT ที่สอดคล้องกับคลาสอ็อบเจ็กต์ จากนั้นจึงล้างพื้นที่ที่เหลือ หลังจากสร้างอินสแตนซ์ของวัตถุแล้ว จะเรียกเมธอดเสมือน AfterConstruction เช่นกัน สุดท้าย ให้บันทึกตัวชี้ที่อยู่ของข้อมูลอินสแตนซ์ออบเจ็กต์ลงในตัวแปร AnObject และด้วยวิธีนี้ ออบเจ็กต์ AnObject จึงเกิดขึ้น
ในทำนองเดียวกัน วัตถุสามารถถูกทำลายได้โดยใช้คำสั่งต่อไปนี้:
วัตถุ ทำลาย;
destructor ของ TObject, Destroy ได้รับการประกาศเป็นวิธีการเสมือน ซึ่งเป็นหนึ่งในวิธีการเสมือนที่มีอยู่ในระบบด้วย วิธีการ Destory เรียกวิธีการเสมือน BeforeDestruction ก่อน แล้วจึงเรียกกระบวนการ ClassDestroy ของระบบ กระบวนการ ClassDestory เรียกวิธีการเสมือน FreeInstance ผ่านคลาส VMT และวิธีการ FreeInstance เรียกกระบวนการ FreeMem เพื่อปล่อยพื้นที่หน่วยความจำของวัตถุ เช่นเดียวกับที่วัตถุหายไปจากระบบ
กระบวนการทำลายล้างวัตถุนั้นง่ายกว่ากระบวนการสร้างวัตถุ เช่นเดียวกับการกำเนิดของชีวิตเป็นกระบวนการตั้งท้องที่ยาวนาน แต่ความตายนั้นค่อนข้างมีอายุสั้น นี่ดูเหมือนจะเป็นกฎเกณฑ์ที่หลีกเลี่ยงไม่ได้
ในระหว่างกระบวนการสร้างและทำลายออบเจ็กต์ ฟังก์ชันเสมือนสองฟังก์ชัน NewInstance และ FreeInstance จะถูกเรียกเพื่อสร้างและปล่อยพื้นที่หน่วยความจำของอินสแตนซ์ออบเจ็กต์ เหตุผลที่ทั้งสองฟังก์ชันนี้ถูกประกาศเป็นฟังก์ชันเสมือนก็เพื่อให้ผู้ใช้มีพื้นที่สำหรับการขยายเมื่อเขียนคลาสอ็อบเจ็กต์พิเศษที่ต้องการให้ผู้ใช้จัดการหน่วยความจำของตนเอง (เช่นในโปรแกรมควบคุมอุตสาหกรรมพิเศษบางโปรแกรม)
การประกาศ AfterConstruction และ BeforeDestruction เป็นฟังก์ชันเสมือนยังช่วยให้คลาสที่ได้รับในอนาคตมีโอกาสที่จะปล่อยให้วัตถุที่เกิดใหม่สูดอากาศบริสุทธิ์ครั้งแรกหลังจากสร้างวัตถุ และเพื่อให้วัตถุสร้างผลพวงที่ตามมาก่อนที่วัตถุจะตาย ทั้งหมดนี้เป็นสิ่งที่สมเหตุสมผล ในความเป็นจริง เหตุการณ์ OnCreate และเหตุการณ์ OnDestroy ของวัตถุ TForm และวัตถุ TDataModule จะถูกทริกเกอร์ตามลำดับในกระบวนการฟังก์ชันเสมือนสองกระบวนการของ TForm และ TDataModule โอเวอร์โหลด
นอกจากนี้ TObjec ยังมีวิธี Free ซึ่งไม่ใช่วิธีเสมือน มีไว้เพื่อปล่อยวัตถุอย่างปลอดภัยเมื่อไม่ชัดเจนว่าวัตถุนั้นว่างเปล่า (ไม่มี) ที่จริงแล้ว ถ้าคุณไม่รู้ว่าออบเจ็กต์นั้นว่างเปล่าหรือไม่ แสดงว่ามีปัญหาเกี่ยวกับตรรกะของโปรแกรมที่ไม่ชัดเจน อย่างไรก็ตาม ไม่มีใครสมบูรณ์แบบและสามารถทำผิดพลาดได้ การใช้ฟรีเพื่อหลีกเลี่ยงข้อผิดพลาดโดยไม่ตั้งใจก็เป็นสิ่งที่ดีเช่นกัน อย่างไรก็ตาม การเขียนโปรแกรมที่ถูกต้องไม่สามารถพึ่งพาโซลูชันดังกล่าวเพียงอย่างเดียวได้ เป้าหมายแรกของการเขียนโปรแกรมควรเป็นเพื่อให้แน่ใจว่าโปรแกรมมีความถูกต้องเชิงตรรกะ!
เพื่อนที่สนใจสามารถอ่านโค้ดต้นฉบับของหน่วยระบบได้ ซึ่งมีโค้ดจำนวนมากเขียนเป็นภาษาแอสเซมบลี เพื่อนที่ระมัดระวังจะพบว่าตัวสร้างของ TObject Create และ Destructor Destory ไม่ได้เขียนโค้ดใด ๆ ที่จริงแล้วผ่านหน้าต่าง Debug CPU ในสถานะการดีบักโค้ดแอสเซมบลีของ Create และ Destory สามารถสะท้อนให้เห็นได้อย่างชัดเจน เนื่องจากผู้เชี่ยวชาญที่สร้าง DELPHI ไม่ต้องการให้ผู้ใช้มีสิ่งที่ซับซ้อนมากเกินไป พวกเขาต้องการให้ผู้ใช้เขียนแอปพลิเคชันตามแนวคิดที่เรียบง่าย และซ่อนงานที่ซับซ้อนภายในระบบเพื่อให้พวกเขาดำเนินการ ดังนั้นเมื่อเผยแพร่หน่วย System.pas รหัสของทั้งสองฟังก์ชันนี้จะถูกลบออกเป็นพิเศษเพื่อทำให้ผู้ใช้คิดว่า TObject เป็นแหล่งที่มาของทุกสิ่ง และคลาสที่ผู้ใช้ได้มาจากความว่างเปล่าโดยสมบูรณ์ ซึ่งไม่ผิดในตัวเอง แม้ว่าการอ่านโค้ดที่สำคัญที่สุดของ DELPHI เหล่านี้จะต้องใช้ความรู้ภาษาแอสเซมบลีเพียงเล็กน้อย แต่การอ่านโค้ดดังกล่าวสามารถทำให้เราเข้าใจถึงต้นกำเนิดและการพัฒนาของโลกของ DELPHI ได้ลึกซึ้งยิ่งขึ้น แม้ว่าคุณจะไม่ค่อยเข้าใจอะไรมากนัก แต่อย่างน้อยความสามารถในการเข้าใจสิ่งพื้นฐานบางอย่างจะช่วยเราได้มากในการเขียนโปรแกรม DELPHI
ส่วนที่ 2 TClass Atom
ในหน่วย System.pas นั้น TClass ถูกกำหนดไว้ดังนี้:
TClass = คลาสของ TObject;
หมายความว่า TClass เป็นคลาสของ TObject เนื่องจาก TObject นั้นเป็นคลาส TClass จึงเป็นคลาสที่เรียกว่าคลาส
ตามแนวคิดแล้ว TClass เป็นคลาสประเภทหนึ่ง ซึ่งก็คือคลาส อย่างไรก็ตาม เรารู้ว่าคลาสของ DELPHI เป็นตัวแทนของข้อมูล VMT ดังนั้นคลาสจึงถือเป็นประเภทที่กำหนดไว้สำหรับรายการข้อมูล VMT จริงๆ แล้วคลาสนี้ถือเป็นประเภทตัวชี้ที่ชี้ไปยังข้อมูล VMT!
ในภาษา C++ แบบดั้งเดิมก่อนหน้านี้ ไม่สามารถกำหนดประเภทของคลาสได้ เมื่อคอมไพล์อ็อบเจ็กต์แล้ว จะได้รับการแก้ไข ข้อมูลโครงสร้างของคลาสจะถูกแปลงเป็นรหัสเครื่องสัมบูรณ์ และข้อมูลคลาสที่สมบูรณ์จะไม่มีอยู่ในหน่วยความจำ ภาษาเชิงวัตถุระดับสูงกว่าบางภาษาสามารถรองรับการเข้าถึงแบบไดนามิกและการเรียกใช้ข้อมูลคลาสได้ แต่มักต้องการกลไกการตีความภายในที่ซับซ้อนและทรัพยากรระบบที่มากขึ้น ภาษา Object Pascal ของ DELPHI ดูดซับคุณลักษณะที่ยอดเยี่ยมบางประการของภาษาเชิงวัตถุระดับสูง ในขณะที่ยังคงรักษาข้อได้เปรียบแบบดั้งเดิมของการคอมไพล์โปรแกรมลงในโค้ดเครื่องโดยตรง ซึ่งช่วยแก้ปัญหาฟังก์ชันขั้นสูงและประสิทธิภาพของโปรแกรมได้อย่างสมบูรณ์แบบ
เป็นเพราะ DELPHI เก็บข้อมูลคลาสที่สมบูรณ์ไว้ในแอปพลิเคชัน ซึ่งสามารถจัดเตรียมฟังก์ชันเชิงอ็อบเจ็กต์ขั้นสูง เช่น และ เพื่อแปลงและระบุคลาสในขณะรันไทม์ ซึ่งข้อมูล VMT ของคลาสมีบทบาทหลักที่สำคัญ เพื่อนที่สนใจสามารถอ่านกระบวนการประกอบทั้งสองของ AsClass และ IsClass ในหน่วยระบบ ซึ่งเป็นโค้ดการใช้งานของ as และเป็นตัวดำเนินการเพื่อเพิ่มความเข้าใจในคลาสและข้อมูล VMT ให้ลึกซึ้งยิ่งขึ้น
-
เนื้อหาต่อไปนี้ยังรวมถึงความเข้าใจเกี่ยวกับตัวสร้างสมมติ กลไกการใช้งานอินเทอร์เฟซ และกลไกการใช้งานการจัดการข้อยกเว้น ฯลฯ หลักการพื้นฐานของ DLPHI ฉันหวังว่าฉันจะทำมันให้เสร็จหลังวันเมย์เดย์และช่วยเหลือทุกคนได้