(ส่วนที่ 3 ของ "การใส่ความคิดเชิงวัตถุตลอด - พูดคุยเกี่ยวกับการพัฒนา Delphi")
บทความสองบทความแรกกล่าวถึงหัวข้อที่เกี่ยวข้องกับการห่อหุ้ม ที่นี่ ฉันต้องการพูดคุยกับคุณเกี่ยวกับมรดกและความหลากหลาย
การสืบทอดและความหลากหลายมีความสัมพันธ์กันอย่างใกล้ชิด Object Pascal แนะนำกลไกโพลีมอร์ฟิกที่เรียกว่าโอเวอร์โหลด แนวคิดนี้ไม่มีส่วนเกี่ยวข้องกับเชิงวัตถุและจะไม่ถูกกล่าวถึงในที่นี้ ความหลากหลายซึ่งสัมพันธ์อย่างใกล้ชิดกับการคิดเชิงวัตถุคือสิ่งที่เรามุ่งเน้น
ความหลากหลายขึ้นอยู่กับแนวคิดของวิธีนามธรรมและวิธีการเสมือน และยังเกี่ยวข้องอย่างใกล้ชิดกับการสืบทอดอีกด้วย เป็นที่เชื่อกันว่าเรามักจะกำหนดออบเจ็กต์พื้นฐานบางส่วน จากนั้นกำหนดการใช้งานบางส่วนเป็นแบบนามธรรม ซึ่งหมายความว่าเราจะกำหนดอินเทอร์เฟซเท่านั้นโดยไม่กำหนดรายละเอียดการใช้งานเฉพาะเจาะจง ตามแนวคิดนี้ เราจะกำหนดออบเจ็กต์ที่ได้รับมา (สืบทอด) หลายรายการ ซึ่งมีการนำรายละเอียดที่ไม่ได้นำไปใช้ในคลาสบรรพบุรุษมาใช้จริง สิ่งนี้ทำให้คลาสพื้นฐานที่เรากำหนดไว้ก่อนหน้านี้เป็นโพลีมอร์ฟิก ข้อดีของกลไกนี้คือ เมื่อเราใช้คลาสเหล่านี้ เราต้องการโค้ดเพียงชุดเดียวเพื่อทำหน้าที่หลายอย่างให้เสร็จสมบูรณ์ สิ่งเดียวที่ต้องเปลี่ยนแปลงคือส่วนที่สร้างอินสแตนซ์ของออบเจ็กต์
สังเกตชั้นเรียนเช่นนี้:
TStream = คลาส (TObject)
-
สาธารณะ
ฟังก์ชั่นอ่าน (var Buffer; จำนวน: Longint): Longint เสมือน;
ฟังก์ชั่นเขียน (const Buffer; Count: Longint): Longint เสมือน;
-
จบ;
คำสงวนเสมือนและนามธรรมระบุว่าวิธีการอ่านและเขียนเป็นฟังก์ชันเสมือนล้วนๆ นี่แสดงให้เห็นว่าคลาส TStream ไม่สามารถใช้งานได้จริง (ไม่สามารถสร้างอินสแตนซ์ของคลาสนี้ได้) มันเป็นเพียงคลาสที่คล้ายกับอินเทอร์เฟซซึ่งกำหนดฟังก์ชันพื้นฐานที่คลาส TStream ควรมีและจำเป็นต้องจัดการ และยังกำหนดว่าคลาสอื่นๆ ที่ได้มาจากคลาส TStream ต้องใช้ฟังก์ชันต่างๆ (เช่น อ่านและเขียน เป็นต้น)
ตัวอย่างเช่น TFileStream ใช้คลาส TStream ในรูปแบบของแอปพลิเคชันไฟล์ดิสก์ ในขณะที่ TMemoryStream ใช้คลาส TStream ในรูปแบบของแอปพลิเคชันหน่วยความจำ ตอนนี้สมมติว่ามีคลาส TMyClass ที่ให้วิธีการ SaveToStream:
TMyClass = คลาส (TObject)
ขั้นตอน SaveToStream (สตรีม: TStream);
จบ;
จากนั้นใช้แนวคิดเรื่องความหลากหลายคุณสามารถมีโค้ดดังนี้:
var
strm: TStream;
คลาสของฉัน: TMyClass;
เริ่ม
strm := TFileStream.Create('abc.txt'); // ß ประเภทอินสแตนซ์ที่แท้จริงของ Stream ที่นี่คือ TFileStream
MyClass := TMyClass.Create;
MyClass.SaveToStream(strm);
-
จบ;
หากต้องการจัดเก็บเนื้อหาของ MyClass ไว้ในหน่วยความจำ เพียงแค่เปลี่ยน
strm := TFileStream.Create('abc.txt');
สำหรับ:
strm := TMemoryStream.Create;
แค่นั้นแหละ.
การใช้ความหลากหลายนั้นจำเป็นต้องมีการทำงานสองลักษณะ หนึ่งคือ แน่นอนว่าความหลากหลายนั้นถูกนำมาพิจารณาในโครงสร้างของคลาสและสามารถจัดเตรียมคลาสระดับกลาง (คลาสนามธรรม) ที่นำฟังก์ชันบางอย่างไปใช้ คลาสนี้ งานนี้สะท้อนให้เห็นในการกำหนดขั้นตอนและพารามิเตอร์ของฟังก์ชัน
อีกจุดที่สำคัญมาก ผมอยากจะเตือนทุกคนว่าการวางแผนชั้นเรียนมีความสำคัญมาก ในยุคของการเขียนโปรแกรมเชิงวัตถุ Class Framework จะเป็นตัวกำหนดกรอบงานของโปรแกรมในระดับสูงและกำหนดความสำเร็จหรือความล้มเหลวของการพัฒนาซอฟต์แวร์ สถาปัตยกรรมคลาสที่ชัดเจนและเป็นลำดับชั้นไม่เพียงแต่อำนวยความสะดวกในการแบ่งและขยายฟังก์ชันเท่านั้น แต่ยังทำให้การบำรุงรักษาโค้ดง่ายขึ้นอีกด้วย ในบรรดาสิ่งเหล่านี้ การใช้แนวคิดเรื่องการสืบทอดและความหลากหลาย การแนะนำคลาสนามธรรม และการแนะนำคลาสระดับกลางเป็นวิธีที่ดีกว่า
ต่อไปนี้เป็นรายการคลาสนามธรรมและคลาสที่เป็นรูปธรรมบางส่วนที่มีให้ใน Delphi:
คลาสคอนกรีตที่ได้มาจากคลาสนามธรรม
TStream TFileStream, TMemoryStream;
TCustomIniFile TIniFile, TMemIniFile, TRegistryIniFile;
TStrings TStringList, TMemoStrings, TListBoxStrings;
ยังมีอีกมากมายที่รอให้คุณและฉันค้นพบ ตัวที่ใช้กันมากที่สุดที่นี่คือ TStream และสิ่งที่ทำให้ฉันประหลาดใจมากที่สุดก็คือ TCustomIniFile TRegistryIniFile ช่วยให้คุณเข้าถึงรีจิสทรีในลักษณะเดียวกับ IniFile! ซึ่งช่วยให้ฉันใช้ชุดโค้ดเพื่อใช้ฟังก์ชันการเขียนรีจิสทรีและการเขียนไฟล์ Ini ได้ แม้ว่าเทคโนโลยีที่เกี่ยวข้องจะเรียบง่าย แต่ความสำคัญของมันก็ไม่ธรรมดา!
(ยังไม่จบมีต่อ)
บทความเพิ่มเติม