User Tools

Site Tools


Sidebar


Introduction


Basic Tutorials


Advance Tutorials


Useful Techniques


Examples

  • Simple Pipe Weight Calculator
  • Unit Convertor

Sidebar

tutorial:class

This is an old revision of the document!


Class

คือ Structural Type ชนิดหนึ่ง ซึ่งมีทั้ง Field, Method และ Property เหมือนกับ Object แต่มีรายละเอียดที่ซับซ้อนมากกว่า

คำว่า Class จริงๆแล้วนั้น หมายถึง ต้นแบบ ซึ่งในการนำไปใช้งานจริงนั้น จำเป็นต้องสร้างตัวผลิตภัณท์ของ Class นั้นขึ้นมาอีกที ในที่นี้ เราเรียกว่า Instance

เพื่อให้เห็นภาพ ขอยกตัวอย่างเรื่องการสร้างรถยนต์ Class ในที่นี้ เปรียบเสมือน“พิมพ์เขียว”ของรถยนต์ ส่วน Instance คือ รถยนต์จริงๆที่ถูกผลิตขึ้นโดยใช้พิมพ์เขียวดังกล่าว ซึ่งแน่นอนว่ารถยนต์เหล่านี้ ย่อมมีคุณสมบัติแตกต่างกัน เช่น สีรถ เครื่องยนต์ หรืออุปกรณ์มาตรฐานต่างๆ เป็นต้น

หากลองสังเกต Component ต่างๆที่ใช้ในการเขียนโปรแกรมสมัยนี้ รวมไปถึง Control ต่างๆที่ใช้ใน GUI Application (เช่น LCL เป็นต้น) ล้วนแล้วแต่ถูกเขียนขึ้นมาจาก Class ทั้งนั้น จะเห็นได้ชัดว่า Class ถูกใช้อย่างแพร่หลายภายใต้การเขียนโปรแกรมเชิงวัตถุ (Object Oriented Programming) เพราะความสามารถที่มีเพิ่มมากขึ้น และมีความยืดหยุ่นมากกว่า Object

สิ่งที่แตกต่างระหว่าง Class กับ Object มีดังนี้

  • Object ใช้หน่วยความจำแบบ Stack ส่วน Class ใช้หน่วยความจำแบบ Heave นั่นทำให้ทุกครั้งที่มีการสร้าง Instance จาก Class ขึ้นมาใช้งาน จำเป็นต้องมีการกำจัด Instance เมื่อใช้งานเสร็จเสมอ เพื่อไม่ให้เกิดปัญหา Memory Leak
  • Class จำเป็นต้องมี Constructor และ Destructor เสมอ ซึ่งสองตัวนี้ คือ Procedure พิเศษ มีไว้สำหรับสร้างและทำลาย Instance ตามลำดับ ในขณะที่ Object ไม่จำเป็นต้องมี
  • Object ใช้การอ้างอิงตัวแปรแบบ Value ส่วน Class ใช้การอ้างอิงตัวแปรแบบ Reference เพื่อให้เห็นภาพ ขอยกตัวอย่าง หากให้ A,B เป็น Object เมื่อใช้คำสั่ง B:=A ; จะหมายถึง มี B เกิดขึ้นมาอีกหนึ่งตัวซึ่งเกิดจากการคัดลอก A ผลก็คือหากเราทำอะไรกับ B ก็จะไม่ส่งผลกับ A เพราะเป็นคนละตัวกัน แต่หากเราให้ A,B เป็น Instance ของ Class เมื่อใช้คำสั่ง B:=A ; จะกลายเป็นว่า B อ้างอิงไปที่ A ไม่ได้เกิดการคัดลอกใดๆ ทีนี้หากเราทำการเปลี่ยนแปลง B จะหมายถึงการเปลี่ยนแปลง A ด้วยเช่นกัน
  • Class มี Access Modifier เพิ่มขึ้นมาจาก Object ซึ่งมีรายละเอียดดังนี้
Access Modifier Descriptions
private มองเห็นได้เฉพาะที่อยู่ใน Unit เดียวกันกับ Class นี้เท่านั้น
protect มองเห็นได้เฉพาะ Derived-Class (Class ที่สืบทอด) เท่านั้น
public มองเห็นได้จากทุกที่ที่ uses Unit นี้
published เหมือนกันกับ Public แต่จะสร้าง Run Time Type Information (RTTI) ขึ้นมา เพื่อประโยชน์ในการ Streaming ข้อมูล
ไม่ระบุ หมายถึง public

การสร้าง Class

การสร้าง Class อย่างง่าย มีรูปแบบดังนี้

Type
 TMyRec = class
   FName:string;
   FValue: integer;
   Procedure DoSomething;  
   Function GetSomething:integer;    
 end;

รูปแบบข้างบนนั้น เทียบเท่าได้กับรูปแบบต่อไปนี้เช่นกัน

Type
 TMyRec = class(TObject)
   FName:string;
   FValue: integer;
   Procedure DoSomething;  
   Function GetSomething:integer;    
 end;

จากรูปแบบข้างบนนั้น จะเห็นได้ว่า ในการสร้าง Class ทุกๆครั้งที่ไม่ได้ระบุว่าสืบทอดมาจาก Class ใด จะเป็นการสร้าง Class สืบทอดจาก TObject ซึ่งเป็น Class พื้นฐานของ FPC เสมอ

tutorial/class.1548643727.txt.gz · Last modified: 2019/01/28 09:48 by admin