User Tools

Site Tools


tutorial:oop

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
tutorial:oop [2018/12/25 15:31]
admin
tutorial:oop [2019/01/05 14:09]
admin
Line 9: Line 9:
  
 =====OOP มีอะไรบ้าง===== =====OOP มีอะไรบ้าง=====
-โดยทั่วไป หลักการ OOP ในหลายๆภาษาจะคล้ายคลึงกัน แตกต่างกันเพียงแค่ Syntax เท่านั้น โดยหลักการดังกล่าว ​มักจะประกอบด้วยส่วนต่างๆดงต่อไปี้ +โดยทั่วไป หลักการ OOP ในหลายๆภาษาจะคล้ายคลึงกัน โดยหลักการดังกล่าวได้ถูกหลอหลอมรมกันจนลายมาเป็น ​Class และ Object นั่นเอง ​อธิบยไ้แบบสั้นๆง่ายๆดังนี้ (เองจก Class และ Object คล้ายัน ​เนื่องจากเกิดจากการ OOP เหมือัน ​นันจะขอนำแค่ Class มาวอย่)
-====1. Classes and Instances==== +
-หาเรจำเป็นต้องสร้งโค๊เกี่ยวกัอะไรสักอย่างหนึ่ง ​กตวอย่าง เช่น รถยนต์ โดยท่รถยต์ทีเรสรางขึ้นมานั้น มีหลายัน ​งจะลำบาก่ใช่น้อยที่ะต้องมเขียนโค๊ดสำถยนต์เหล่านัไปทีละตวจหมด ปญหาเหล่าี้จะดไป หากเรารู้จกกรเขียน Class และ Object(Instance\\ \\+
  
-**Classes** ​คือ ​ต้นแบบ เปรียบเสมือนการออแบบรถยน์ว่าควรประกบไปดวยคุณสมบัติรบ้าง เช่น โครสร้ง เครื่นต์ ช่าง รบบ่งกำง ตัวง เป็ต้น ทั้งหมดที่กล่าวมานี้ ​ราเียกว่า Property แค่นั้นยม่พอ รถยนตควรจะมีความสามารถไรบง นั่นือ ​ขับได้ ​วิ่งไปมาวยความรวดเ็วได้ เบรคได้ ​ราเรียสิ่งนว่า Method ​+====1. Encapsulation==== 
 +คือ การจำัดกาเข้าึง Field, Method และ Property ​ต่างๆ ขง Class นันๆ เพื่อไม่ใหเกิดกรียกใงานจากภายนอกอย่ไมเหมาะสม ารจดการเข้านที่นี้คือารใส่ Access Specifier เหล่านี้ ​คือ Private, Protected, Public และ Published สำหรับรายละียดสมารถอได้จากหวขอถป  
 +====2. Inheritance==== 
 +คือ การถ่าทอด สืบต่อ เช่น Class B สืบ่อความสามาถมาจาก Class A จะทำให้ ​ Class B สาารถทำทุกอย่างท่ Class A ทำได้  
 +====3. Polymorphism==== 
 +คือ การเปลี่ยนรูปร่าง เช่น หาก Class B สืบต่อความสามารถมาจาก Class A จทำให้ Class B ถูกมอาเป็น Class B หรือ ​Class A ก็ได้ในขณะเียกัน 
 +====4. Overriding==== 
 +คือ การปรับเปลี่น เช่น หาก Class B สืบต่อความสามาถมาจาก Class A แล้ว สำหบ Class B เาสามารถปรับเปลี่ยนวามสามารถที่ได้รับมาจาก ​Class A เพือให้ทำไดเหมะสมขึ้น
  
-**Objects (Instances)** คือ ผลิตภัณท์ที่เกิดจากต้นแบบ (Class) เช่น เราผลิตรถยนต์ขึ้นมาใช้งานจริง 5 คัน ซึ่งใน 5 คันนี้ อาจมี Property ที่ต่างกันไป ​ แต่ทุกคันมี Method ที่เหมือนกัน เราเรียกรถยนต์เหล่านี้ว่า Object หรือ Instance เป็นต้น แต่เนื่องจากคำว่า Object มีใช้ในภาษา Pascal เช่นกัน และเป็นคำเฉพาะซึ่งหมายถึงการสร้างวัตถุที่เป็นต้นแบบขึ้นมาเหมือนกัน (คล้าย Class) ดังนั้นต่อไปนี้จะขอใช้คำว่า Instance แทน+\\ 
 +---- 
 +======Class and Object====== 
 +Class และ Object คือ ผลิตผลจากการนำ OOP มาประยุกต์ใช้ ทั้งคู่มีความคล้ายคลึงกันมาก รูปแบบในการสร้าง Class และ Object มีดังนี้ 
 + 
 + 
 +  Type 
 +     ​TMyClass = class 
 +       ​Item:​integer;​ 
 +       ​Procedure DoSomething; ​     
 +     ​end;​ 
 + 
 +  Type 
 +     ​TMyObject = object 
 +       ​Item:​integer;​ 
 +       ​Procedure DoSomething; ​     
 +     ​end;​ 
 +      
 +จริงๆแล้ว ทั้งสองอย่างนี้มีข้อแตกต่างกันอยู่ และถูกใช้งานต่างกัน แต่จะขอพูดถึงรายละเอียดของ Object ก่อน ว่าสามารถทำอะไรได้บ้าง จากนั้นจึงโยงไปสู่รายละเอียดของ Class ในภายหลัง 
 + 
 +=====Object===== 
 +Object เป็น Structural Type คล้ายกันกับ Record เพียงแต่มี Property และ Method เพิ่มเข้ามา และรองรับหลักการ OOP ที่กล่าวมาแล้วข้างต้นทั้งหมด Object ถือกำเนิดขึ้นมาก่อนตั้งแต่สมัยของ Turbo Pascal ต่อมาภายหลัง เมื่อมีการสร้าง Delphi ขึ้นมาใช้แทน เป็นเหตุให้มีการคิดค้น Class ขึ้นมาใช้งานด้วยเช่นกัน  
 + 
 +อย่างไรก็ตาม Class ยังมีข้อแตกต่างกัน 
 + 
 +=====Class===== 
 +หากเราจำเป็นต้องสร้างโค๊ดเกี่ยวกับอะไรสักอย่างหนึ่ง ยกตัวอย่าง เช่น รถยนต์ โดยที่รถยนต์ที่เราจะสร้างขึ้นมานั้น มีหลายคัน คงจะลำบากไม่ใช่น้อยที่จะต้องมาเขียนโค๊ดสำหรับรถยนต์เหล่านั้นไปทีละตัวจนหมด ปัญหาเหล่านี้จะหมดไป หากเรารู้จักการเขียน Class \\ \\ 
 + 
 +**Class** คือ ต้นแบบ เปรียบเสมือนการออกแบบรถยนต์ว่าควรประกอบไปด้วยคุณสมบัติอะไรบ้าง เช่น โครงสร้าง เครื่องยนต์ ช่วงล่าง ระบบส่งกำลัง ตัวถัง เป็นต้น ทั้งหมดที่กล่าวมานี้ เราเรียกว่า Property แค่นั้นยังไม่พอ รถยนต์ควรจะมีความสามารถอะไรบ้าง นั่นคือ ขับได้ วิ่งไปมาด้วยความรวดเร็วได้ เบรคได้ เราเรียกสิ่งนี้ว่า Method  
 + 
 +**Instance** คือ ผลิตภัณท์ที่เกิดจากต้นแบบ (Class) เช่น เราผลิตรถยนต์ขึ้นมาใช้งานจริง 5 คัน ซึ่งใน 5 คันนี้ อาจมี Property ที่ต่างกันไป ​ แต่ทุกคันมี Method ที่เหมือนกัน เราเรียกรถยนต์เหล่านี้ว่า Object หรือ Instance เป็นต้น แต่เนื่องจากคำว่า Object มีใช้ในภาษา Pascal เช่นกัน และเป็นคำเฉพาะซึ่งหมายถึงการสร้างวัตถุที่เป็นต้นแบบขึ้นมาเหมือนกัน (คล้าย Class) ดังนั้นต่อไปนี้จะขอใช้คำว่า Instance แทน
  
 **__หมายเหตุ__** - **Object** สำหรับภาษา Pascal หมายถึงการสร้างวัตถุที่มีทั้งคุณสมบัติ (Property) และกระบวนการ (method) เหมือนกันกับ Class เพียงแต่ Class นั้นเพิ่งเกิดมาในภายหลัง โดย Object จะคล้ายกับ Record ที่มี Property กับ Method นั่นเอง หรือ ที่เรียกว่า Advance Record \\ **__หมายเหตุ__** - **Object** สำหรับภาษา Pascal หมายถึงการสร้างวัตถุที่มีทั้งคุณสมบัติ (Property) และกระบวนการ (method) เหมือนกันกับ Class เพียงแต่ Class นั้นเพิ่งเกิดมาในภายหลัง โดย Object จะคล้ายกับ Record ที่มี Property กับ Method นั่นเอง หรือ ที่เรียกว่า Advance Record \\
Line 23: Line 58:
   *Object ใช้การอ้างอิงตัวแปรแบบ Value ส่วน Class ใช้การอ้างอิงตัวแปรแบบ Reference เพื่อให้เห็นภาพ ขอยกตัวอย่าง หากให้ A,B เป็น Object เมื่อใช้คำสั่ง B:=A ; จะหมายถึง มี B เกิดขึ้นมาอีกหนึ่งตัวซึ่งเกิดจากการคัดลอก A ผลก็คือหากเราทำอะไรกับ B ก็จะไม่ส่งผลกับ A เพราะเป็นคนละตัวกัน แต่หากเราให้ A,B เป็น Instance ของ Class เมื่อใช้คำสั่ง B:=A ; จะกลายเป็นว่า B อ้างอิงไปที่ A ไม่ได้เกิดการคัดลอกใดๆ ทีนี้หากเราทำการเปลี่ยนแปลง B จะหมายถึงการเปลี่ยนแปลง A ด้วยเช่นกัน   *Object ใช้การอ้างอิงตัวแปรแบบ Value ส่วน Class ใช้การอ้างอิงตัวแปรแบบ Reference เพื่อให้เห็นภาพ ขอยกตัวอย่าง หากให้ A,B เป็น Object เมื่อใช้คำสั่ง B:=A ; จะหมายถึง มี B เกิดขึ้นมาอีกหนึ่งตัวซึ่งเกิดจากการคัดลอก A ผลก็คือหากเราทำอะไรกับ B ก็จะไม่ส่งผลกับ A เพราะเป็นคนละตัวกัน แต่หากเราให้ A,B เป็น Instance ของ Class เมื่อใช้คำสั่ง B:=A ; จะกลายเป็นว่า B อ้างอิงไปที่ A ไม่ได้เกิดการคัดลอกใดๆ ทีนี้หากเราทำการเปลี่ยนแปลง B จะหมายถึงการเปลี่ยนแปลง A ด้วยเช่นกัน
  
-=== 1.1 Class === 
 การสร้าง Class เริ่มต้น ทำได้ดังนี้ การสร้าง Class เริ่มต้น ทำได้ดังนี้
  
Line 67: Line 101:
 **Field Parameters** คือ ส่วนที่ถูกประกาศเป็นตัวแปรคล้ายกับการประกาศ var จากตัวอย่างข้างบน คือ FName และ FValue ตัวแปรเหล่านี้มักถูกประกาศเพื่อใช้เก็บค่าสำหรับ Property ​ **Field Parameters** คือ ส่วนที่ถูกประกาศเป็นตัวแปรคล้ายกับการประกาศ var จากตัวอย่างข้างบน คือ FName และ FValue ตัวแปรเหล่านี้มักถูกประกาศเพื่อใช้เก็บค่าสำหรับ Property ​
 \\ \\ \\ \\
-**Constructor and Destructor** คือ Procedure ชนิดหนึ่ง แต่มีความสำคัญต่อ class มาก จึงต้องเขียนให้มีชื่อเฉพาะเป็นของตนเอง Constructor จะที่ถูกเรียกเพื่อใช้สร้าง Instance โดยทำการจัดสรรหน่วยความจำให้เหมาะสม ส่วน Destructor จะถูกเรียกเพื่อทำลาย Instance แล้วคืนหน่วยความจำ\\ \\ +==== Constructor and Destructor ​====  
-**Properties** คือคุณสมบัติของ Instance ประกอบไปด้วย Getter (คำสั่งหลัง read) และ Setter (คำสั่งหลัง write)\\ \\+คือ Procedure ชนิดหนึ่ง แต่มีความสำคัญต่อ class มาก จึงต้องเขียนให้มีชื่อเฉพาะเป็นของตนเอง Constructor จะที่ถูกเรียกเพื่อใช้สร้าง Instance โดยทำการจัดสรรหน่วยความจำให้เหมาะสม ส่วน Destructor จะถูกเรียกเพื่อทำลาย Instance แล้วคืนหน่วยความจำ\\ \\ 
 +====Properties====  
 +คือคุณสมบัติของ Instance ประกอบไปด้วย Getter (คำสั่งหลัง read) และ Setter (คำสั่งหลัง write)\\ \\
 เพื่อเป็นการอธิบายให้เห็นภาพ จะขอยกตัวอย่าง เพื่อเป็นการอธิบายให้เห็นภาพ จะขอยกตัวอย่าง
  
Line 82: Line 118:
   ValueX:=12;   ValueX:=12;
   ​   ​
-ทำไมต้องมี Getter Setter ให้ยุ่งยาก แทนที่จะใช้ var อย่างเดียว?​ ประโยชน์ของมันมีดังนี้ครับ+ทำไมต้องมี Getter Setter ให้ยุ่งยาก แทนที่จะใช้ var หรือ Field อย่างเดียว?​ ประโยชน์ของการใช้งาน Property ​มีดังนี้ครับ
   *ใช้คัดกรองตัวแปร บางครั้งเรารับค่าเพื่อการคำนวณในช่วง 0-100 เท่านั้น หากผู้ใช้ใส่ค่าเกินกว่าค่าดังกล่าวมา จะสามารถคัดกรองให้เป็นค่าที่อยู่ในช่วง 0-100 แทนได้   *ใช้คัดกรองตัวแปร บางครั้งเรารับค่าเพื่อการคำนวณในช่วง 0-100 เท่านั้น หากผู้ใช้ใส่ค่าเกินกว่าค่าดังกล่าวมา จะสามารถคัดกรองให้เป็นค่าที่อยู่ในช่วง 0-100 แทนได้
   *เพื่อให้ค่าของ Property ได้มีการ update ตลอดเวลา โดยเฉพาะหาก property ของเรา ขึ้นอยู่กับค่าอื่น เมื่อใดที่มีการเปลี่ยนค่า ก็จะมีการ update ค่า property เราด้วยเสมอ   *เพื่อให้ค่าของ Property ได้มีการ update ตลอดเวลา โดยเฉพาะหาก property ของเรา ขึ้นอยู่กับค่าอื่น เมื่อใดที่มีการเปลี่ยนค่า ก็จะมีการ update ค่า property เราด้วยเสมอ
-**Access Modifiers** คือ private, protected, public และ published โดยแต่ละตัวกำหนดความสามรถในการเข้าถึง Field, Procedure, Function หรือ Property ที่อยู่ภายใต้ สรุปได้ดังนี้+  ​*published properties ที่มาจาก TPersistent Class สามารถใช้งานกับ RTTI Controls ได้ เพื่อลดการเขียนโค๊ดในการเชื่อมต่อกับ Controls สำหรับ GUI Applications\\ 
 + 
 +รูปแบบการเขียน Property มีหลักๆดังนี้ 
 +  ​*Property ที่มี Getter, Setter เป็น Field 
 + 
 +  property Value:​integer read FValue write Value; 
 + 
 +  ​*property ที่มี Getter, Setter เป็น Procedure/​Function ซึ่งโดยปกติ Getter จะเป็น Function ส่วน Setter จะเป็น Procedure 
 + 
 +  property ValueX:​integer read GetValueX write SetValueX;​ 
 +  function GetValueX:​integer;​ 
 +  procedure SetValueX(Value:​integer);​ 
 + 
 +  ​*Property ที่แสดงค่าได้อย่างเดียว (ReadOnly) 
 + 
 +  property IsOK:​boolean read GetIsOK; 
 +   
 +\\ \\ 
 + 
 +====Access Modifiers====  
 +คือ private, protected, public และ published โดยแต่ละตัวกำหนดความสามรถในการเข้าถึง Field, Procedure, Function หรือ Property ที่อยู่ภายใต้ สรุปได้ดังนี้
  
 ^  Access Modifier ​ ^  Descriptions ​ ^  ^  Access Modifier ​ ^  Descriptions ​ ^ 
Line 93: Line 149:
 |published| เหมือนกันกับ Public แต่จะสร้าง Run Time Type Information (RTTI) ด้วย | |published| เหมือนกันกับ Public แต่จะสร้าง Run Time Type Information (RTTI) ด้วย |
  
-====2. Encapsulation==== +<hidden Example-1: Property Getter Setter Test> 
-====3Inheritance===+**ตัวอย่าง** การสร้าง Class ที่มี Properties 2 ตัว คือ ValueX กับ ValueY โดยที่ ValueY นั้นเกิดจากการนำค่า ValueX คูณด้วย 2 จึงต้องเป็นแบบ ReadOnly \\ 
-====4Polymorphism===+__ข้อสังเกต__:​ ValueY เกิดจากการคำนวณ ValueX ดังนั้นหากมีการเปลี่ยนแปลง ValueX ค่าของ ValueY จะมีการ Update ผ่าน Getter\\ 
-====5. Overriding===+<sxh delphi;>​ 
-====6Overloading====+program TestGetterSetter;​ 
 + 
 +type 
 + 
 +  { TMyClass } 
 + 
 +  TMyClass ​class 
 +    private 
 +      FValueX:​integer;​ 
 +      function GetValueY: integer; 
 +    public 
 +      Constructor Create; 
 +      destructor destroy; override; 
 +      property ValueX:​integer read FVAlueX write FValueX; 
 +      property ValueY:​integer read GetValueY;​ 
 +  end; 
 + 
 +{ TMyClass } 
 + 
 +function TMyClass.GetValueY:​ integer; 
 +begin 
 +  result:=2*ValueX; 
 +end; 
 + 
 +constructor TMyClass.Create; 
 +begin 
 +  FValueX:=5; 
 +  writeln('​Instance has been created!!!'​);​ 
 + 
 +end; 
 + 
 +destructor TMyClass.destroy;​ 
 +begin 
 +  writeln('​Instance has been destroyed!!!'​);​ 
 +  inherited destroy; 
 +end; 
 + 
 +var 
 +  MyClass:​TMyClass;​ 
 + 
 +begin 
 +  MyClass:=TMyClass.Create;​ 
 +  ​writeln('​MyClass.ValueX ​',​MyClass.ValueX);​ 
 +  writeln('​MyClass.ValueY ​',​MyClass.ValueY); 
 +  writeln('​Change ValueX to 50'​);​ 
 +  MyClass.ValueX:​=50; 
 +  ​writeln('​MyClass.ValueX ​',​MyClass.ValueX); 
 +  writeln('​MyClass.ValueY ​',​MyClass.ValueY);​ 
 +  ​MyClass.Free;​ 
 +  readln(); 
 +end. 
 +</​sxh> ​  
 +\\ 
 +Compiled Result: 
 + 
 +  Instance has been created!!! 
 +  MyClass.ValueX ​= 5 
 +  MyClass.ValueY ​10 
 +  ​Change ValueX to 50 
 +  MyClass.ValueX ​50 
 +  MyClass.ValueY ​100 
 +  Instance has been destroyed!!! 
 +    
 +</​hidden> ​
tutorial/oop.txt · Last modified: 2019/01/17 07:33 by admin