Table of Contents

Generic And Template

Generic คืออะไร

คือการเขียนโปรแกรมให้สามารถใช้ได้กับหลากหลาย DataType โดยทั่วไปเรามักจะใช้ Generic กับการเขียนโปรแกรมดังนี้

1. Generic Procedure/Function

คือการสร้าง Procedure/Function ที่รับค่า(หรือส่งค่า) Argument โดยไม่ได้ระบุ DataType เพื่อให้ Procedure/Function ดังกล่าว สามารถนำไปใช้ได้กับ DataType ที่หลากหลายนั่นเอง

รูปแบบการประกาศ สรุปได้ดังนี้

Topic Format
Generic Procedure
generic procedure ProcedureName<T>(Arg1:T);
begin
  {Do something}
end;
Generic Function
generic function FunctionName<T>(Arg1:T):T;
begin
  {Do something}
end;

การเรียกใช้ สมตติว่าเราจะนำมาใช้กับ integer จะเรียกใช้ได้ดังนี้

specialize FunctionName<integer>(x): 

Example-1: Generic Function สำหรับหาผลรวมของตัวแปร 2 ค่า

Example-1: Generic Function สำหรับหาผลรวมของตัวแปร 2 ค่า

generic function sum<T>(x,y:T):T;
begin
  result:=x+y;
end;

var x,y:double;

Begin
 x:=12.78;
 y:=9.86;
 writeln('sum(x,y) = ',specialize sum<double>(x,y));

End.


หมายเหตุ - Generic Function ปัจจุบันสามารถใช้ได้เฉพาะ Lazarus เวอร์ชั่น Trunk (สำหรับ Developer) เท่านั้น ยังไม่สามารถใช้ได้กับเวอร์ชั่นทั่วไป

2. Generic Class

คือการสร้าง Class ที่ใช้กับ DataType ใดๆก็ได้ ไม่เฉพาะเจาะจง คล้ายกับ Generic Procedure/Function แค่เปลี่ยนเป็น Class เท่านั้น อย่างไรก็ตาม สำหรับ Generic Class นั้น ก่อนการนำไปใช้ จะต้องมีการสร้าง Class เป้าหมาย ขึ้นมาก่อนเสมอ รูปแบบของการประกาศและการสร้าง Class สรุปได้ดังนี้

Topic Format
การประกาศ Generic Class
type
  generic TList<T> = class
    Items: array of T;
    procedure Add(Value: T);
  end;
การสร้าง Class จาก Generic Class
Type  
  TIntegerList = specialize TList<Integer>;
  TPointerList = specialize TList<Pointer>;
  TStringList = specialize TList<string>;