เป็นที่รู้จักกันดีสำหรับผู้ที่คุ้นเคยกับประวัติที่ C # และ. NET Framework เริ่มต้นจากการที่ "Delphi เขียนใหม่เพื่อให้รู้สึกเหมือน Java" ได้รับการออกแบบโดยหัวหน้าผู้พัฒนาที่อยู่เบื้องหลัง Delphi, Anders Hejlsberg สิ่งต่าง ๆ ได้เบี่ยงเบนไปเล็กน้อยตั้งแต่นั้นมา แต่ในช่วงต้นของความคล้ายคลึงกันได้ชัดเจนว่ามีการเก็งกำไรร้ายแรงบางอย่างที่. NET เป็นผลิตภัณฑ์ดั้งเดิมของ Borland
แต่ฉันได้ดูบางสิ่ง. NET เมื่อเร็ว ๆ นี้และหนึ่งในคุณสมบัติที่น่าสนใจและมีประโยชน์ที่สุดจาก Delphi ดูเหมือนจะหายไปโดยสิ้นเชิง: แนวคิดของคลาสเป็นประเภทข้อมูลชั้นหนึ่ง สำหรับผู้ที่ไม่คุ้นเคยกับมันประเภทTClass
แสดงถึงการอ้างอิงถึงระดับคล้ายกับType
ประเภทใน. NET แต่ที่. NET ใช้Type
ในการสะท้อนเดลฟีใช้TClass
เป็นส่วนสำคัญในตัวของภาษา มันช่วยให้สำนวนที่เป็นประโยชน์ต่าง ๆ ที่ไม่มีและไม่มีอยู่จริงเช่นตัวแปรคลาสย่อยและวิธีคลาสเสมือน
ทุกภาษา OO มีวิธีการเสมือนซึ่งคลาสที่แตกต่างกันใช้แนวคิดพื้นฐานเดียวกันของวิธีการในวิธีที่ต่างกันและจากนั้นวิธีการที่เหมาะสมจะได้รับการเรียกใช้ที่รันไทม์ตามชนิดที่แท้จริงของอินสแตนซ์วัตถุที่เรียกว่า Delphi ขยายแนวคิดนี้ไปยังคลาส: ถ้าคุณมีการอ้างอิง TClass ที่กำหนดเป็นคลาสย่อยเฉพาะ (เช่นclass of TMyClass
หมายความว่าตัวแปรสามารถรับการอ้างอิงคลาสใด ๆ ที่สืบทอดมาTMyClass
แต่ไม่ใช่สิ่งใดนอก heirarchy) ที่มีเมธอดเสมือนของคลาสขอบเขต มันสามารถถูกเรียกโดยไม่มีอินสแตนซ์โดยใช้ชนิดของคลาสที่แท้จริง การใช้รูปแบบนี้กับตัวสร้างทำให้การใช้งานเป็นเรื่องเล็กน้อยสำหรับโรงงาน
ดูเหมือนจะไม่มีอะไรเทียบเท่าใน. NET มีประโยชน์เท่ากับการอ้างอิงคลาส (และโดยเฉพาะอย่างยิ่งคอนสตรัคเตอร์เสมือนจริงและเมธอดคลาสเสมือนอื่น ๆ !) มีใครเคยพูดอะไรเกี่ยวกับสาเหตุที่พวกเขาถูกทิ้ง?
ตัวอย่างเฉพาะ
Deserialization แบบฟอร์ม
Delphi VCL บันทึกแบบฟอร์มในDFM
รูปแบบ DSL สำหรับอธิบายลำดับชั้นองค์ประกอบ เมื่อเครื่องอ่านฟอร์มแยกวิเคราะห์ข้อมูล DFM เครื่องจะอ่านข้ามวัตถุที่อธิบายดังนี้:
object Name: ClassName
property = value
property = value
...
object SubObjectName: ClassName
...
end
end
สิ่งที่น่าสนใจที่นี่คือClassName
ส่วนหนึ่ง แต่ละคลาสคอมโพเนนต์จะรีจิสเตอร์TClass
กับระบบการสตรีมคอมโพเนนต์ในinitialization
เวลานั้น (คิดว่าตัวสร้างสแตติกเท่านั้นแตกต่างกันเล็กน้อยรับประกันว่าจะเกิดขึ้นทันทีเมื่อเริ่มต้น) สิ่งนี้จะลงทะเบียนแต่ละคลาสในสตริง -> TClass hashmap ด้วยชื่อคลาสเป็นคีย์
แต่ละองค์ประกอบลงมาจากที่มีคอนสตรัคเสมือนที่ใช้อาร์กิวเมนต์เดียวTComponent
Owner: TComponent
ส่วนประกอบใด ๆ สามารถแทนที่ตัวสร้างนี้เพื่อจัดเตรียมการเริ่มต้นของตัวเอง เมื่อผู้อ่าน DFM อ่านชื่อคลาสจะค้นหาชื่อใน hashmap ข้างต้นและดึงการอ้างอิงคลาสที่สอดคล้องกัน (หรือยกข้อยกเว้นหากไม่มีอยู่) จากนั้นเรียกตัวสร้างเสมือนของ TComponent ซึ่งเป็นที่รู้จักกันดี เนื่องจากฟังก์ชั่นการลงทะเบียนใช้การอ้างอิงระดับที่จำเป็นในการสืบทอดจาก TComponent และคุณจะจบลงด้วยวัตถุประเภทที่เหมาะสม
หากขาดสิ่งนี้ WinForms ที่เทียบเท่ากันก็คือ ... ความยุ่งเหยิงที่ยิ่งใหญ่ที่จะนำมันอย่างตรงไปตรงมาซึ่งต้องการภาษา. NET ใหม่ใด ๆ มันค่อนข้างน่าตกใจเมื่อคุณคิดถึงมัน เนื่องจากจุดรวมของการมี CLR คือการให้หลายภาษาใช้โครงสร้างพื้นฐานพื้นฐานเดียวกันระบบ DFM ในสไตล์จึงเหมาะสมเป็นอย่างยิ่ง
ขยาย
คลาสตัวจัดการรูปภาพที่ฉันเขียนสามารถให้กับแหล่งข้อมูล (เช่นพา ธ ไปยังไฟล์รูปภาพของคุณ) จากนั้นโหลดวัตถุรูปภาพใหม่โดยอัตโนมัติหากคุณพยายามเรียกชื่อที่ไม่ได้อยู่ในคอลเลกชัน แต่มีอยู่ในแหล่งข้อมูล มันมีตัวแปรคลาสที่พิมพ์เป็นclass of
คลาสอิมเมจฐานแสดงถึงคลาสของวัตถุใหม่ใด ๆ ที่จะสร้าง มันมาพร้อมกับค่าเริ่มต้น แต่มีบางจุดเมื่อสร้างภาพใหม่โดยมีวัตถุประสงค์พิเศษว่าควรตั้งค่ารูปภาพด้วยวิธีต่างๆ (สร้างโดยไม่มีช่องอัลฟาเรียกข้อมูลเมตาพิเศษจากไฟล์ PNG เพื่อระบุขนาดสไปรต์ ฯลฯ )
สิ่งนี้สามารถทำได้โดยการเขียนรหัสการกำหนดค่าจำนวนมากและส่งตัวเลือกพิเศษไปยังวิธีการทั้งหมดที่อาจสิ้นสุดการสร้างวัตถุใหม่ ... หรือคุณสามารถสร้างคลาสย่อยของคลาสอิมเมจพื้นฐานที่แทนที่เมธอดเสมือนที่ ด้านที่มีปัญหาได้รับการกำหนดค่าจากนั้นใช้การลอง / ในที่สุดบล็อกเพื่อแทนที่คุณสมบัติ "คลาสเริ่มต้น" ชั่วคราวตามที่ต้องการแล้วจึงกู้คืน การทำมันด้วยตัวแปรอ้างอิงระดับนั้นง่ายกว่ามากและไม่ใช่สิ่งที่สามารถทำได้ด้วยยาชื่อสามัญแทน
TClass
ประโยชน์ด้วยรหัสตัวอย่างบ้างไหม? ในการวิจัยทางอินเทอร์เน็ตคร่าวๆของฉันเกี่ยวกับTClass
ฉันพบว่าTClass
สามารถส่งผ่านเป็นพารามิเตอร์ สิ่งนี้ทำใน. NET โดยใช้ Generics เมธอดจากโรงงานถูกทำเครื่องหมายstatic
ใน. NET และไม่ต้องการอินสแตนซ์ของคลาสในการดำเนินการ
TClass
เป็นคุณสมบัติภาษาพื้นฐานที่ต้องการการสนับสนุนคอมไพเลอร์ คุณไม่สามารถ "เขียนของคุณเอง" โดยไม่ต้องเขียนภาษาของคุณเองและสำหรับ. NET แม้จะไม่เพียงพอเพราะรูปแบบวัตถุถูกกำหนดโดย CLR ไม่ใช่ด้วยภาษาแต่ละภาษา เป็นสิ่งที่แท้จริงต้องเป็นส่วนหนึ่งของ. NET Framework หรือไม่สามารถอยู่ได้