แผนบริหารการสอนประจ ...anantakul.net/learning/8_c++.pdf ·...

20
แผนบริหารการสอนประจาบทที8 หัวข้อเนื ้อหา การเขียนโปรแกรมเชิงวัตถุ ความหมายของ คลาส และวัตถุ การสร้างคลาส การเรียกใช้เฮดเดอร์ไฟล์ คอนสตรัทเทอร์และดีสตรัทเทอร์ การสร้างตัวตน คุณสมบัติของระบบเชิงวัตถุ คลาสแม่แบบ อินเทอร์เฟซ สรุป แบบฝึกหัด เอกสารอ้างอิง วัตถุประสงค์เชิงพฤติกรรม เมื่อศึกษาบทนี ้แล ้วนักศึกษาสามารถ 1. บอกหลักการเขียนโปรแกรมเชิงวัตถุได้ 2. บอกความหมายและความแตกต่างของคลาสและเชิงวัตถุได้ 3. สร้างคลาสได้ 4. คอนสตรัทเทอร์และดีสตรัทเทอร์เชิงวัตถุ ได้ 5. กาหนดการเข้าถึงคุณสมบัติและพฤติกรรมของวัตถุได้ 6. สร้างคลาสแม่แบบ 7. ถ่ายทอดคุณสมบัติของคลาสแบบทั่วไปหรือแบบอินเทอร์เฟซได้

Upload: others

Post on 26-Jul-2020

13 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: แผนบริหารการสอนประจ ...anantakul.net/learning/8_C++.pdf · แผนบริหารการสอนประจ าบทที่ 8 หัวข้อเนื้อหา

แผนบรหารการสอนประจ าบทท 8

หวขอเนอหา การเขยนโปรแกรมเชงวตถ ความหมายของ คลาส และวตถ การสรางคลาส การเรยกใชเฮดเดอรไฟล คอนสตรทเทอรและดสตรทเทอร การสรางตวตน คณสมบตของระบบเชงวตถ คลาสแมแบบ อนเทอรเฟซ สรป แบบฝกหด เอกสารอางอง

วตถประสงคเชงพฤตกรรม เมอศกษาบทนแลวนกศกษาสามารถ

1. บอกหลกการเขยนโปรแกรมเชงวตถได 2. บอกความหมายและความแตกตางของคลาสและเชงวตถได 3. สรางคลาสได 4. คอนสตรทเทอรและดสตรทเทอรเชงวตถ ได 5. ก าหนดการเขาถงคณสมบตและพฤตกรรมของวตถได 6. สรางคลาสแมแบบ 7. ถายทอดคณสมบตของคลาสแบบทวไปหรอแบบอนเทอรเฟซได

Page 2: แผนบริหารการสอนประจ ...anantakul.net/learning/8_C++.pdf · แผนบริหารการสอนประจ าบทที่ 8 หัวข้อเนื้อหา

178

วธสอนและกจกรรมการเรยนการสอน 1. วธสอน

วธสอนแบบบรรยายและแบบการเรยนรดวยตนเอง 2. กจกรรมการเรยนการสอน

ใหผ เรยนศกษาเนอหาจากหนงสอ ต ารา เอกสารสอนและเวบไซตท เกยวของเพมเตมใหนกศกษาเขยนบทความเกยวกบแนวคดและหลกการเขยนโปรแกรมเชงวตถดวยภาษาซพลสพลส

สอการเรยนการสอน 1. โปรแกรมน าเสนองาน 2. เนอหาบทท 8 การเขยนโปรแกรมเชงวตถ 3. ระบบเครอขายอนเทอรเนต 4. โปรแกรมไมโครซอฟทวชวลสตดโอ 2010

การวดผลและประเมนผล 1. สงเกตการตอบค าถามและตงค าถาม 2. สงเกตการเขยนบทความเกยวกบโอโอพ 3. สงเกตการเขยนโปรแกรมเชงวตถในหองทดลอง 4. วดเจตคตจากการท ากจกรรมและพฤตกรรมความกระตอรอรนในการท ากจกรรม

Page 3: แผนบริหารการสอนประจ ...anantakul.net/learning/8_C++.pdf · แผนบริหารการสอนประจ าบทที่ 8 หัวข้อเนื้อหา

179

บทท 8

การเขยนโปรแกรมเชงวตถ

การเขยนโปรแกรมเชงวตถ เปนแนวคดในการเขยนโปรแกรมโดยมองสรรพสงรอบตวเปนวตถ (Object) เชนเดยวกบวตถทมอยในโลกความจรง ซงโครงสรางของการเขยนโปรแกรมจะมลกษณะทเปนการเลยนแบบ หรอ จ าลองมาจากการมองทตววตถทมอยจรง ในการมองทตววตถนน จะประกอบไปดวย ชอ คณสมบต และ พฤตกรรม โดยเมอมเหตการณมากระท ากบวตถ วตถนนอาจมการเปลยนแปลงสถานะ หรอ คณสมบตได ขอดของการเขยนโปรแกรมเชงวตถ คอ สามารถน ากลบมาใชใหมและการมองทกอยางเปนโลกของความจรง

การเขยนโปรแกรมเชงวตถ ภาษาซพลสพลสเปนภาษาเชงวตถ ซงสามารถรองรบการก าหนดคณสมบตของ การก าหนดขอม ลน ามธรรม (Abstraction) ก ารห อ ห ม วตถ (Encapsulation) ก ารซ อนขอม ล (Information Hiding) การถ ายทอด (Inheritance) และการพองรป (Polymorphism) (ยทธนา ลลาศวฒนกล. 2547:230) แนวคดของภาษาเชงวตถทส าคญ คอ การน ากลบมาใชใหมและมองทกสงทกอยางในโลกของความเปนจรง ซงจากแนวคดนท าใหการเขยนเชงวตถเปนทนยมในภาษาสงและถกน ามาใชกนอยางแพรหลายในการพฒนาซอฟตแวรปจจบน

ความหมายของ คลาส และ วตถ คลาส (Class) หมายถง แมแบบหรอแบบพมพ (Blueprint) ทใชในการสรางวตถสวนออบเจกต (Object) หมายถง วตถทเกดจากคลาสหรอแมแบบทนยามไว เชน ในการสรางบาน ตวบานทเปรยบเสมอนวตถ จะถกกอสรางขนมาโดยมคลาสเปนแมแบบ คอ แบบบานนนเอง แตกอนทจะท าการสรางคลาสสงทจ าเปน กคอตองปรบเปลยนทศนคต และความคด โดยการมองทกสงทกอยางทงมชวตและสงทไมมชวตใหเปนวตถใหหมดเสยกอน แลวท าการนยามคลาสเพอทสรางวตถนนๆ

Page 4: แผนบริหารการสอนประจ ...anantakul.net/learning/8_C++.pdf · แผนบริหารการสอนประจ าบทที่ 8 หัวข้อเนื้อหา

180

เพอท าใหมความเขาใจในเรองของการเขยนโปรแกรมเชงวตถเพมมากขน จะยกตวอยางโดยใหมองวา มนษย เปนวตถวตถหนงทมคณสมบต และมพฤตกรรมเปนของตวเอง ซงสามารถนยาม คลาสมนษย (Human Class) เพอใชสรางตวตนมนษยได ดงตวอยางในภาพท 8.1

คลาสมนษย คณสมบต (Properties) - ชอ (Name) - เพศ (Gender) - อาย (Age) พฤตกรรม (Behaviors) - แนะน าตว (Introduce)

ภาพท 8.1 โครงสรางและสวนประกอบของคลาสมนษย

จากตวอยางในภาพท 8.1 จะเหนไดวาคลาสมนษยจะประกอบไปดวยชอ เพศ และ อาย เปนคณสมบตของคลาส สวนพฤตกรรมของคลาสมนษยนน จะประกอบไดดวย แนะน าตวเอง ซงจากตวอยางในภาพท 8.1 สามารถน าเอามาออกแบบคลาสไดอะแกรม (Class Diagram) ดวยภาษายเอมแอล (Unified Modeling Language : UML) ดงภาพท 8.2

Human - String Name - String Gender - int Age + Human() + Introduce( )

ภาพท 8.2 คลาสไดอะแกรม

การสรางคลาส จากคลาสไดอะแกรมดงภาพท 8.2 สามารถน าคลาสมาแปลงเปนชดค าส งในภาษาซพลสพลสดวยไมโครซอฟทวชวลสตดโอ 2010 โดยมรปแบบการประกาศคลาส ดงน

ชอคลาส

คณสมบตของคลาส

พฤตกรรมของคลาส

Page 5: แผนบริหารการสอนประจ ...anantakul.net/learning/8_C++.pdf · แผนบริหารการสอนประจ าบทที่ 8 หัวข้อเนื้อหา

181

การสรางเฮดเดอรไฟล ในการประกาศหรอสรางคลาสจะนยมสรางไวในสวนของเฮดเดอรไฟล (Header File) โดยมขนตอนการสรางเฮดเดอรไฟลในโปรแกรมไมโครซอฟทวชวลสตดโอ ดงน

1. คลกทไอคอน Solution Explorer แลวจากนน ใหคลกขวาทโพลเดอรเฮดเดอรไฟล (Header File) แลวเลอก Add --> New Item ดงภาพท 8.3

ภาพท 8.3 หนาตางโซลชนเอกพลอเลอร (Solution Explorer) ทมา: Microsoft Visual Studio.Net (2010)

classชอคลาส{ private: สวนประกาศคณบตของคลาส (Properties) public: สวนประกาศพฤตกรรมของคลาส(Methods) }; ชอคลาส::ชอคอนสตรทเทอร { // ชดค าสง; } ชนดขอมลชอคลาส::ชอเมธอด { // ชดค าสง; }

Page 6: แผนบริหารการสอนประจ ...anantakul.net/learning/8_C++.pdf · แผนบริหารการสอนประจ าบทที่ 8 หัวข้อเนื้อหา

182

2. ในหนาตางเพมไอเทมใหม (Add New Item) ใหเลอกทเฮดเดอรไฟล จากนนใหพมพ ชอเฮเดอรไฟลทตองการลงไปในชองชอ แลวคลกทป ม Add ดงภาพท 8.4

ภาพท 8.4 หนาตางเพมไอเทมใหม

3. หลงจากท าในขอท 2 จะไดเฮดเดอรไฟลทสรางขนมา ดงภาพท 8.5 ใหดบเบลคลกทไฟลเฮดเดอรทสรางขนมา แลวท าการเขยนซอรสโคดโปรแกรมตามชดค าสงในตารางท 8.1

ภาพท 8.5 หนาตางการสรางเฮดเดอรไฟล

Page 7: แผนบริหารการสอนประจ ...anantakul.net/learning/8_C++.pdf · แผนบริหารการสอนประจ าบทที่ 8 หัวข้อเนื้อหา

183

ตารางท 8.1 รปแบบการเขยนค าสงการสรางเฮดเดอรไฟล

สวนซอรสไฟลHuman.h

01 # include<iostream> 02 usingnamespace std; 03 class Human { //สรางคลาสชอ Human 04 private: 05 char *Name; // ประกาศคณสมบต Name ใหเกบขอความชอ 06 char *Gender; 07 int Age; 08 public: 09 Human(); // ประกาศคอนสตรทเทอรของคลาสHuman 10 void Introduce( ); // สรางเมธอดแนะน าตวเอง 11 }; 12 Human::Human() { } 13 void Human::Introduce (){ 14 Human::Name = "Mr.Anantakul\n"; 15 Human::Gender = "Male\n"; 16 Human::Age = 35; 17 cout<<"My name is "<< Human::Name <<endl; 18 cout<<"Gender is "<< Human::Gender <<endl; 19 cout <<"Age is "<<Human::Age<<endl; 20 }

การเรยกใชเฮดเดอรไฟล หลงจากทท าการสรางคลาสเกบไวในสวนของเฮดเดอรไฟลเรยบรอยแลว ถาตองการเรยกใชเฮดเดอรเหลานน ใหใชการเขยนตวประมวลผลกอน #include ชอ “Header File.h” แลวท าการเรยกคลาสมาท างานสวนของฟงกชนหลก ดงภาพท 8.6 โดยเขยนซอรสโคด โปรแกรมตามชดค าสงในตารางท 8.2

ภาพท 8.6 หนาตางการเรยกใชเฮดเดอร

Page 8: แผนบริหารการสอนประจ ...anantakul.net/learning/8_C++.pdf · แผนบริหารการสอนประจ าบทที่ 8 หัวข้อเนื้อหา

184

ตารางท 8.2 รปแบบการเขยนค าสงการเรยกใชเฮดเดอรไฟล

สวนซอรสไฟลExHuman.cpp

01 // ExHuman.cpp 02 #include"Human.h" // เรยกใชคลาส Human 03 intmain() { 04 Human myHuman; // สรางอนสเตนท หรอ ออปเจตชอ myHuman 05 myHuman.Introduce(); // เรยกใชเมธทอด Introduce(); ทอยในคลาส Human 06 return 0; 07 }

โดยมผลลพธทไดจากรนโปรแกรมดงภาพท 8.7

ภาพท 8.7 ผลลพธการรนโปรแกรมการเรยกใชเฮดเดอรไฟล จากผลการท างานของตารางท 8.2 จะเหนไดวาในฟงกชน main() ทอยในซอรสโคดของไฟล “ExHuman.cpp” นนจะมการดงเอาเฮดเดอรไฟลไลบราลทชอวา “Human.h” ซงเปนคลาสมนษยนนเขามาใชรวมดวย เพอใหสามารถเรยกใชเมธอด Introduce() จากคลาสมนษยไดจากซอรสโคด ตารางท 8.2 ประกาศ “Human myHuman” นนเปนการสรางวตถ หรอ ตวตนใหกบคลาสหรอทเรยกวา ตวตน (Instance) ของคลาส ทชอ “myHuman” ผลลพธทจากการสงใหโปรแกรมท างาน จะไดตวตนขนตามโครงสรางของคลาสมนษย คอ นายอนนตกล เพศชาย อาย 38 และสามารถแนะน าตวเองได

คอนสตรทเทอรและดสตรทเทอร คอนสตรทเทอร (Constructor) เปนฟงกชนทมชอเดยวกบคลาส ทใชในการก าหนดคาเรมตนใหแกสมาชกทงหลาย ถาไมไดก าหนดคอนตรทเทอรในขณะทเขยนชดค าสง เมอมการสงใหโปรแกรประมวลผล โปรแกรมจะท าการสรางคอนสตรทเทอรใหอตโนมต หรอทเรยกวา ดฟอลตคอนสตรทเทอร (Default Constructor) โดยทคอนสตรทเทอรจะไมมคาพารามเตอร แตสามารถท าการโอเวอรโหลดคอนสตรทเทอรได (Overload Constructor) สวนดสตรทเทอร (Destructor) เปนฟงกชนทมไวท าลายวตถทหมดอาย การประกาศใชจะมเครองหมายทวด (~) น าหนาดสตรทเทอร (Horton, 2006: 399) โดยมรปแบบการประกาศคอนสตรทเทอร ดงน

Page 9: แผนบริหารการสอนประจ ...anantakul.net/learning/8_C++.pdf · แผนบริหารการสอนประจ าบทที่ 8 หัวข้อเนื้อหา

185

ตารางท 8.3 รปแบบการเขยนค าสงการเรยกใชคอนสตรทเทอร

01 #include<iostream> 02 usingnamespace std; 03 class Box{ 04 private: 05 double length,width, height; 06 public: 07 Box(double l ,double w ,double h){//ประกาศคอนสตรทเทอร 08 length =l; 09 width = w; 10 height = h; 11 cout<<endl<<"Constructor called"<<endl; 12 cout<<length<<endl; 13 cout<<height<<endl; 14 cout<<width <<endl; 15 }

16 ~Box(){//ประกาศ ดสตรทเทอร 17 cout<<"Destructor called."<<endl; 18 } 19 }; 20 int main(){ 21 Box boxes(1.0,1.0,1.0); 22 return 0; 23 }

โดยมผลลพธทไดจากรนโปรแกรมดงภาพท 8.8

ภาพท 8.8 ผลลพธการรนโปรแกรมการเรยกใชคอนสตรทเทอร

class ClassName { private: data member; public: ClassName(); // การประกาศคอนสตรทเทอรใหกบคลาส ~ ClassName(); // การประกาศดสตรทเทอรใหกบคลาส };

Page 10: แผนบริหารการสอนประจ ...anantakul.net/learning/8_C++.pdf · แผนบริหารการสอนประจ าบทที่ 8 หัวข้อเนื้อหา

186

การสรางตวตน การประกาศตวตนหรออนสแทนซ (Instance) หรอการสรางออบเจกตใหกบคลาสนนสามารถท าการประกาศไดมากกวา 1 ตวแทนจากคลาสเดยวกนน ซงจะเกดขนระหวางโปรแกรมท างานและการท าเชนนสามารถทจะท าใหแตละเชงวตถ มขอมลเฉพาะของตวเอง ท าใหเชงวตถ แตละเชงวตถของคลาส ซงใชชดค าสงชดเดยวกนได แตผลลพธมคณลกษณะและคณสมบตทแตกตางกน ดงชดค าสงในตารางท 8.4

ตารางท 8.4 รปแบบการเขยนค าสงการเรยกใชอนสแทนซ

สวนเฮดเดอรไฟลstudent.h 01 #include<iostream> 02 usingnamespace std; 03 class Student{ 04 private: 05 char *StudentName; 06 int StudentID; 07 public: 08 Student(); 09 void setStudentName(char *stdName); 10 void setStudentID(int stdID); 11 void getStudent(); 12 }; 13 Student::Student() {} 14 void Student::setStudentID(int stdID) { 15 Student::StudentID = stdID; 16 } 17 void Student::setStudentName(char *stdName) { 18 Student::StudentName = stdName; 19 } 20 void Student::getStudent(){ 21 cout<<"Student ID : "<<Student::StudentID ; 22 cout<<" Student Name: "<<Student::StudentName; 23 }

สวนซอรสไฟลstudent.cpp 01 #include"student.h" 02 intmain(){ 03 Student studentFirst ; 04 Student studentSecond; 05 studentFirst.setStudentID(111); 06 studentFirst.setStudentName ("Mr. Devid Tavota"); 07 studentSecond.setStudentID (222); 08 studentSecond.setStudentName ("Mr.John Contant"); 09 studentFirst.getStudent (); 10 cout<<endl; 11 studentSecond.getStudent (); 12 cout<<endl; 13 return 0; 14 }

Page 11: แผนบริหารการสอนประจ ...anantakul.net/learning/8_C++.pdf · แผนบริหารการสอนประจ าบทที่ 8 หัวข้อเนื้อหา

187

โดยมผลลพธทไดจากการเรยกใชอนสแทนซ ดงภาพท 8.9

ภาพท 8.9 ผลลพธการรนโปรแกรมการเรยกใชอนสแทนซ

เมอพจารณาชดค าสงในตารางท 8.4 ท าใหไดขอสรปวาเชงวตถ หรอการสรางตวตน ทถกสรางจากคลาสนกศกษา “Student” ขนมานนมอย 3 ตว ซงแตละตวจะมชอทถกประกาศไวไมเหมอนกนจงเปนเหตทท าใหเชงวตถ หรอกรณตวอยางทง 3 ตวนนมคณสมบตทแตกตางกนนนเอง

คณสมบตของระบบเชงวตถ 1. อนฟอรเมชนไฮดง (Information Hiding) คอ การซอนเรนหรอปดบงคณสมบตและ

พฤตกรรมภายในคลาสน น โดยไมใหคลาสอนไมสามารถเขาถงหรอเรยกใชคณสมบตและพฤตกรรมดงกลาวนนไดนน ซงการก าหนดการเขาถงคณสมบตและพฤตกรรมของคลาสในการเขยนโปรแกรมภาษาซพลสพลสจะใช ค าสงวนได 3 ค าคอ

- สวนตว (Private) หมายถง ก าหนดคณลกษณะและพฤตกรรมเปนสวนตวใชไดเฉพาะภายในคลาส

- สาธารณะ (Public) หมายถง ก าหนดคณลกษณะและพฤตกรรมเปนสาธารณะใชไดเฉพาะกลมคลาส

- ปองกน (Protected) หมายถง ก าหนดคณลกษณะและพฤตกรรมเปนลกษณะปองกนใชไดทกคลาส

Human

- String Name - String Gender - int Age # Money + Human() + Introduce( )

ภาพท 8.10 การซอนรายละเอยด

private

public

protected

Page 12: แผนบริหารการสอนประจ ...anantakul.net/learning/8_C++.pdf · แผนบริหารการสอนประจ าบทที่ 8 หัวข้อเนื้อหา

188

จากคลาสไดอะแกรมจะใชเครองหมาย “ – ” แทนความหมายสวนตว เครองหมาย “#” แทนความหมาย ปองกน และ เครองหมาย “+” แทนสาธารณะโดยสามารถแปลความหมายไดวา คลาสมนษยมคณสมบต ท เปนสวนตว คอ “NameGender” และ “Age” สวนทปองกนไวคอ “Money” และมพฤตกรรมทงหมดเปนสาธารณะ

2. การถายทอดคณสมบต (Inheritance) คอ การถายทอดคณสมบตจากคลาสหลกซเปอรคลาส (Super Class) ไปสคลาสยอยซบคลาส (Subclass) ดงภาพท 8.11

+Human()

+Introduce()

#Name

#Gender

#Age

Human

+getStudentID()

-StudentID

Student

ภาพท 8.11 การถายทอดคณสมบตและพฤตกรรม จากภาพท 8.11 แสดงคลาสไดอะแกรม (Class Diagram) สามารถแสดงการสบทอดคณสมบตและพฤตกรรมจากคลาสมนษย “Human” ท เปนคลาสหลกไปยงคลาสนกศกษา “Student” ทเปนคลาสยอย จากการถายทอดคณสมบตนน หมายความวาคลาสนกศกษา “Student” สามารถรบการถายทอดคณสมบตของคลาสมนษย “Human” ในสวนคณสมบต และ พฤตกรรม ทงหมด ยกเวน ทเปนสวนตว ซงจากภาพท 8.11 คลาสนกศกษา “Student” ไดรบคณสมบตและพฤตกรรม ทงหมดจากคลาสมนษย “Human” และสามารถน ามาเขยนชดค าสงในภาษาซพลสพลสได ดงชดค าสงในตารางท 8.5

Page 13: แผนบริหารการสอนประจ ...anantakul.net/learning/8_C++.pdf · แผนบริหารการสอนประจ าบทที่ 8 หัวข้อเนื้อหา

189

ตารางท 8.5 รปแบบการเขยนค าสงการถายทอดคณสมบต

สวนเฮดเดอรไฟลHuman.h 01 #include<iostream> 02 usingnamespace std; 03 class Human { 04 protected: 05 char *Name; 06 char *Gender; 07 int Age; 08 public: 09 void human(); 10 void Introduce(); 11 };

สวนเฮดเดอรไฟลstudent.h

01 #include"Human.h" 02 class Student : public Human{ 03 private: 04 int StudentID; 05 char *StudentName; 06 public : 07 Student( ); 08 void Introduce(); 09 }; 10 Student::Student() { 11 Student::StudentID = 11; 12 Student::Name = "Somchai"; 13 Student::Gender = "Male"; 14 Student::Age = 25; 15 } 16 void Student::Introduce(){ 17 cout<<"Student ID is "<< Student::StudentID <<endl; 18 cout<<"Student Name is "<<Student::Name <<endl; 19 cout<<"Student Gender is "<<Student::Gender <<endl; 20 cout<<"Studne Age is "<<Student::Age <<endl; 21 }

สวนซอรสไฟลExOOP.cpp

01 #include"student.h"

02 int main(){ 03 Student myStudent; //สรางตวตน (instance) ใหกบคลาส 04 myStudent.Introduce(); 05 return 0; 06 }

Page 14: แผนบริหารการสอนประจ ...anantakul.net/learning/8_C++.pdf · แผนบริหารการสอนประจ าบทที่ 8 หัวข้อเนื้อหา

190

เมอสงโปรแกรมท างานจะไดผลลพธทดงภาพท 8.12

ภาพท 8.12 ผลลพธการรนโปรแกรมการถายทอดคณสมบต

การก าหนดคณลกษณะและพฤตกรรมเปนสาธารณะใชไดเฉพาะกลมคลาส โดยมรปแบบการประกาศการถายทอดจากคลาส ดงน

ผลลพธทไดจากการสงโปรแกรมตามตารางท 8.5 ใหท างานจะเหนไดวาคลาสนกศกษาไดรบการถายทอดคณสมบตจากคลาสมนษย คอ ชอ เพศ และอาย หากตองการใหคณสมบตและพฤตกรรม สามารถถายทอดไดจะตองก าหนดการซอนหรอปดบงคณสมบตและพฤตกรรมภายในคลาสเปนปองกนและสาธารณะเทานน 3. โพลมอรปรซม (Polymorphism) คอการพองรป หรอการก าหนดพฤตกรรมทม เขยน

เหมอนกนแตมการก าหนดรปแบบการกระท าภายในทเหมอนกน หรอไดผลลพธของการพฤตกรรมนนแตกตางการกนออกไป เชน การเปลงเสยงพฤตกรรมของคลาสสงมชวต ซงมคลาสมนษยและคลาสสนข เปนซบคลาสจะมผลลพธของการเปลงเสยงทไมเหมอนกน อาจกลาวไดวาหลกการพองรป คอ การทน าเอาพฤตกรรมของซบคลาสทไดรบมาจากซปเปอรคลาสมาเขยนเพมเตม (Override) เพอใหเหมาะสมตอการน าไปใชงาน แสดงดงภาพท 8.13

+Introduce()

#Name

#Gender

#Age

Human

Living

+Introduce()

#Name

#Gender

#Age

Animal

ภาพท 8.13 การพองรป

classชอคลาสยอย : publicชอคลาสหลก

Page 15: แผนบริหารการสอนประจ ...anantakul.net/learning/8_C++.pdf · แผนบริหารการสอนประจ าบทที่ 8 หัวข้อเนื้อหา

191

จากภาพท 8.13 คลาสยอย ไดแก คลาสมนษย และคลาสสตว ซงคลาสท งสองไดรบคณสมบต และพฤตกรรมทงหมด มาจากการถายทอดของคลาสสงมชวต (Living Class) โดยคลาสทงมเมธอด Introduce() นนชอเหมอนกน หรอทเรยกวา การพองรป แตท างานไมเหมอนกนและผลลพธทไดกจะตางกน เชน เมธอด Introduce( ) ในคลาสมนษยจะท าหนาทบอกชอ เพศ และ อาย สวนเมธอด Introduce( ) ในคลาสสงมชวตจะท าหนาทไดแคเปลงเสยงออกมา เปนตน

4. เอนแคบซเลชน (Encapsulation) คอ การหอหมวตถหรอท าหบหอ หรอการผนกโคดใหเปนแคปซลเหมอนแคปซลยาเพอใหผอนน าไปใชไดโดยงาย แนวคดนเปนการสรางวตถทแยกชดค าสงทเปนสวนเชอมตอ (Interface) และขอมลออกจากกน สรางคลาสชอ “CalAge” ท าหนาทค านวณหาอาย หากตองการสรางคลาสมนษย เพอเรยกดอายกไมจ าเปนตองร วธค านวณหาอาย เพยงสรางวตถจากคลาส “CalAge” ขนมา แลวสงผลลพธกลบมาให

ตวอยางการสรางการหอหมวตถ เชน จากคลาสมนษย สรางเมธอดCalAge () แลวผใชปอนคาปทเกด และสงวตถนนไปเรยกใชเมธอดนจากภายนอกคลาส เพอดผลอายกลบมาโดยไมสนใจวา วธการค านวณอายของเมธอด CalAge( ) ภายในคลาสมนษยเปนอยางไร ดงชดค าสงในตารางท 8.6 ตารางท 8.6 รปแบบการเขยนค าสงการสรางการหอหมวตถ

สวนเฮดเดอรไฟลHuman.h

01 #include<iostream> 02 usingnamespace std; 03 class Human { 04 protected: 05 char *Name; 06 char *Gender; 07 public: 08 Human(); 09 void CalAge(int bornYear); 10 }; 11 Human::Human() {} 12 void Human::CalAge (int bornYear){ 13 int nowYear = 2550; 14 int Age = nowYear - bornYear; 15 cout <<"Your have age is "<<Age <<endl; 16 }

Page 16: แผนบริหารการสอนประจ ...anantakul.net/learning/8_C++.pdf · แผนบริหารการสอนประจ าบทที่ 8 หัวข้อเนื้อหา

192

โดยมผลลพธทไดดงภาพท 8.14

ภาพท 8.14 ผลลพธการรนโปรแกรมการสรางการหอหมวตถ

คลาสแมแบบ การประกาศคลาสเทมเพส (Class Template) เหมอนกบการประกาศฟงกชนเทมเพสโดยมรปแบบการประกาศ ดงน

ในการประกาศคลาสเทมเพลตใชงาน คอ ตองมค าหลก “template” น าหนาคลาสตามดวยรายการเทมเพลตพารามเตอร (Template List Parameter) ภายในเครองหมาย <> ดงชดค าสงในตารางท 8.7

สวนซอรสไฟลExOOP.cpp

01 #include"human.h" 02 intmain(){ 03 Human myHuman; //สรางตวตน (instance) ใหกบคลาส 04 myHuman.CalAge(2515); 05 return 0; 06 }

template<typenameTemplateName> class ClaseName { std::vector<TemplateName> data; };

Page 17: แผนบริหารการสอนประจ ...anantakul.net/learning/8_C++.pdf · แผนบริหารการสอนประจ าบทที่ 8 หัวข้อเนื้อหา

193

ตารางท 8.7 รปแบบการเขยนค าสงการประกาศคลาสแมแบบ

สวนซอรสไฟลtemplate.cpp

01 #include<iostream> 02 #include<vector> 03 usingnamespace std; 04 template<typename T> 05 class MyQueue{ //ประกาศคลาส MyQueu 06 std::vector<T> data; 07 public: 08 void Add(T const&); 09 void Remove(); 10 void Print(); 11 }; 12 template<typename T>void MyQueue<T> ::Add(T const&d){//ประกาศเทมคลาส 13 data.push_back(d); 14 } 15 template<typename T>void MyQueue<T>::Remove(){ 16 data.erase(data.begin( ) + 0,data.begin( ) + 1); 17 } 18 template<typename T>void MyQueue<T>::Print(){//ประกาศเทมคลาส 19 std::vector <int>::iterator It1; 20 It1 = data.begin(); 21 for ( It1 = data.begin( ) ; It1 != data.end( ) ; It1++ ) 22 cout <<" "<< *It1<<endl; 23 } 24 void main(){

25 MyQueue<int> q; 26 q.Add(1); 27 q.Add(2); 28 cout<<"Before removing data"<<endl; 29 q.Print(); 30 q.Remove(); 31 cout<<"After removing data"<<endl; 32 q.Print(); 33 }

โดยมผลลพธทไดดงภาพท 8.15

ภาพท 8.15 ผลลพธการรนโปรแกรมการประกาศคลาสแมแบบ

อนเทอรเฟซ อนเทอรเฟซ (Interface) หมายถง การถายทอดคณสมบตทมความสามารถในการรบการถายทอดได ทงภายในและภายนอกคลาสโดยมรปแบบการประกาศคลาสอนเทอรเฟซ ดงน

Page 18: แผนบริหารการสอนประจ ...anantakul.net/learning/8_C++.pdf · แผนบริหารการสอนประจ าบทที่ 8 หัวข้อเนื้อหา

194

หนาทของอนเทอรเฟซ กคอเปนคลาสหลกทมขอตกลงตางๆในการบอกคลาสทมาบรการหรอเชอมตองปฏบตตามโดยไมจ าเปนตองรโครงสรางภายใน ดงตารางท 8.8 ตารางท 8.8 รปแบบการเขยนค าสงการประกาศคลาสอนเทอรเฟซ

สวนซอรสไฟล interface.cpp

01 #include<iostream> 02 usingnamespace std; 03 class AreaClass { 04 public: 05 double height; 06 double width; 07 }; 08 class Rectangle : public AreaClass {//ประกาศอนเทอรเฟซคลาส 09 public: 10 Rectangle(double h, double w); 11 double area(); 12 }; 13 class Isosceles : public AreaClass {//ประกาศอนเทอรเฟซคลาส 14 public: 15 Isosceles(double h, double w); 16 double area(); 17 }; 18 Rectangle::Rectangle(double h, double w){ 19 height = h; 20 width = w; 21 } 22 Isosceles::Isosceles(double h, double w){ 23 height = h; 24 width = w;

25 } 26 double Rectangle::area(){ 27 return width * height; 28 } 29 double Isosceles::area(){ 30 return 0.5 * width * height; 31 } 32 int main(){ 33 Rectangle rectangleObject(10.0, 5.0); 34 Isosceles isoscelesObject(4.0, 6.0); 35 cout <<"Rectangle: "<< rectangleObject.area() << endl; 36 cout <<"Triangle: "<< isoscelesObject.area() << endl; 37 return 0; 38 }

interface_access interface class name : inherit_access base_interface { ชดค าสง ; }; interface_access interface struct name : inherit_access base_interface { ชดค าสง; };

Page 19: แผนบริหารการสอนประจ ...anantakul.net/learning/8_C++.pdf · แผนบริหารการสอนประจ าบทที่ 8 หัวข้อเนื้อหา

195

โดยมผลลพธทไดดงภาพท 8.16

ภาพท 8.16 ผลลพธการรนโปรแกรมการประกาศคลาสอนเทอรเฟซ

สรป แนวคดของการเขยนโปรแกรมเชงวตถ เรมจากการมองทกสงทกอยางในโลกของความเปนจรงเปนวตถหรอออบเจกต (Object) ทประกอบไปดวยสวนประกอบ 2 สวนคอ คณสมบตหรอแอตทรบวส (Attribute) และพฤตกรรมหรอการกระท า (Operation) โดยขอดของการน าหลกการระบบเชงวตถมาประยกตคอ การน ากลบมาใชใหมได จากแนวคดนท าใหการเขยนเชงวตถเปนทนยมในภาษาสงและถกน ามาใชกนอยางแพรหลาย สงทนกเขยนโปรแกรมควรจะใหความส าคญคอตองศกษาและใหเขาใจคณสมบตของหลกการเชงวตถทประกอบไปดวย การก าหนดขอมลนามธรรมการท าใหขอมลอยในขอบเขตจ ากดหรอการหอหมวตถและการซอนขอมลการถายทอดและท าหลายรปแบบหรอการฟองรปเพราะคณสมบตเหลานจะมประโยชนอยางมากในการพฒนาโปรแกรมเชงวตถ สงส าคญการเขยนโปรแกรมเชงวตถนนจ าเปนตองรและเขาใจแนวคดของคลาสและวตถการสรางคลาส การสรางตวตน สรางคอนสตรทเทอรหรอดสตรทเทอร เปนตน ในเนอหาบทตอไปจะเปนกลาวเกยวการพฒนาภาษาซพลสพลสบนระบบปฏบตการวนโดวส

แบบฝกหด

จงตอบค าถามตอไปน 1. จงออกแบบคลาสพรอมอธบายสวนประกอบตางๆของคลาส 2. จงเขยนรปแบบการประกาศโครงสรางคลาส พรอมอธบาย 3. จงสรางเฮดเดอรไฟลขนมาใหมโดยก าหนดชอเปน “Human” 4. จงเขยนโปรแกรมเพอสรางคลาสโดยให “Human” เปนชอคลาส สวนคณสมบตของ

คลาสมดงน ชอ อาย เพศ และพฤตกรรมของคลาสมดงน แนะน าตวและพฤตกรรมตางๆ 5. จงเขยนโปรแกรมเพอเรยกใชเมธอดและคณสมบตภายในคลาส Human

Page 20: แผนบริหารการสอนประจ ...anantakul.net/learning/8_C++.pdf · แผนบริหารการสอนประจ าบทที่ 8 หัวข้อเนื้อหา

196

6. จงอธบายการก าหนดการเขาถงคณสมบตและพฤตกรรมของวตถมกแบบ 7. จงอธบายการถายทอดคณสมบตและพฤตกรรมจากคลาส 8. จงออกแบบคลาสหลกและคลาสยอยและใหมการน าหลกการของการถายทอด

คณสมบตและพฤตกรรมจากคลาสหลกไปสคลาสยอย 9. จงเขยนโปแกรมเครองคดเลขตามหลกการเชงวตถดวยภาษาซพลสพลส 10. จงบอกความแตกตางของการเขยนโปรแกรมแบบเชงวตถกบการเขยนโปรแกรมแบบ

เชงโครงสราง

เอกสารอางอง ย ท ธ น า ล ล า ศ วฒ น ก ล . (2521). Advanced Visual C++ Verison 6.0 ฉ บ บ Database

Programming. กรงเทพ : ซคเซส มเดย. Horton, I. ( 2 006). Beginning Visual C++ 2005. Indiana:Wiley.Microsoft Visual

Studio.Net.(2010). [CD-ROM].Microsoft Co.Ltd.