แผนบริหารการสอนประจ ...anantakul.net/learning/8_c++.pdf ·...
TRANSCRIPT
แผนบรหารการสอนประจ าบทท 8
หวขอเนอหา การเขยนโปรแกรมเชงวตถ ความหมายของ คลาส และวตถ การสรางคลาส การเรยกใชเฮดเดอรไฟล คอนสตรทเทอรและดสตรทเทอร การสรางตวตน คณสมบตของระบบเชงวตถ คลาสแมแบบ อนเทอรเฟซ สรป แบบฝกหด เอกสารอางอง
วตถประสงคเชงพฤตกรรม เมอศกษาบทนแลวนกศกษาสามารถ
1. บอกหลกการเขยนโปรแกรมเชงวตถได 2. บอกความหมายและความแตกตางของคลาสและเชงวตถได 3. สรางคลาสได 4. คอนสตรทเทอรและดสตรทเทอรเชงวตถ ได 5. ก าหนดการเขาถงคณสมบตและพฤตกรรมของวตถได 6. สรางคลาสแมแบบ 7. ถายทอดคณสมบตของคลาสแบบทวไปหรอแบบอนเทอรเฟซได
178
วธสอนและกจกรรมการเรยนการสอน 1. วธสอน
วธสอนแบบบรรยายและแบบการเรยนรดวยตนเอง 2. กจกรรมการเรยนการสอน
ใหผ เรยนศกษาเนอหาจากหนงสอ ต ารา เอกสารสอนและเวบไซตท เกยวของเพมเตมใหนกศกษาเขยนบทความเกยวกบแนวคดและหลกการเขยนโปรแกรมเชงวตถดวยภาษาซพลสพลส
สอการเรยนการสอน 1. โปรแกรมน าเสนองาน 2. เนอหาบทท 8 การเขยนโปรแกรมเชงวตถ 3. ระบบเครอขายอนเทอรเนต 4. โปรแกรมไมโครซอฟทวชวลสตดโอ 2010
การวดผลและประเมนผล 1. สงเกตการตอบค าถามและตงค าถาม 2. สงเกตการเขยนบทความเกยวกบโอโอพ 3. สงเกตการเขยนโปรแกรมเชงวตถในหองทดลอง 4. วดเจตคตจากการท ากจกรรมและพฤตกรรมความกระตอรอรนในการท ากจกรรม
179
บทท 8
การเขยนโปรแกรมเชงวตถ
การเขยนโปรแกรมเชงวตถ เปนแนวคดในการเขยนโปรแกรมโดยมองสรรพสงรอบตวเปนวตถ (Object) เชนเดยวกบวตถทมอยในโลกความจรง ซงโครงสรางของการเขยนโปรแกรมจะมลกษณะทเปนการเลยนแบบ หรอ จ าลองมาจากการมองทตววตถทมอยจรง ในการมองทตววตถนน จะประกอบไปดวย ชอ คณสมบต และ พฤตกรรม โดยเมอมเหตการณมากระท ากบวตถ วตถนนอาจมการเปลยนแปลงสถานะ หรอ คณสมบตได ขอดของการเขยนโปรแกรมเชงวตถ คอ สามารถน ากลบมาใชใหมและการมองทกอยางเปนโลกของความจรง
การเขยนโปรแกรมเชงวตถ ภาษาซพลสพลสเปนภาษาเชงวตถ ซงสามารถรองรบการก าหนดคณสมบตของ การก าหนดขอม ลน ามธรรม (Abstraction) ก ารห อ ห ม วตถ (Encapsulation) ก ารซ อนขอม ล (Information Hiding) การถ ายทอด (Inheritance) และการพองรป (Polymorphism) (ยทธนา ลลาศวฒนกล. 2547:230) แนวคดของภาษาเชงวตถทส าคญ คอ การน ากลบมาใชใหมและมองทกสงทกอยางในโลกของความเปนจรง ซงจากแนวคดนท าใหการเขยนเชงวตถเปนทนยมในภาษาสงและถกน ามาใชกนอยางแพรหลายในการพฒนาซอฟตแวรปจจบน
ความหมายของ คลาส และ วตถ คลาส (Class) หมายถง แมแบบหรอแบบพมพ (Blueprint) ทใชในการสรางวตถสวนออบเจกต (Object) หมายถง วตถทเกดจากคลาสหรอแมแบบทนยามไว เชน ในการสรางบาน ตวบานทเปรยบเสมอนวตถ จะถกกอสรางขนมาโดยมคลาสเปนแมแบบ คอ แบบบานนนเอง แตกอนทจะท าการสรางคลาสสงทจ าเปน กคอตองปรบเปลยนทศนคต และความคด โดยการมองทกสงทกอยางทงมชวตและสงทไมมชวตใหเปนวตถใหหมดเสยกอน แลวท าการนยามคลาสเพอทสรางวตถนนๆ
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 โดยมรปแบบการประกาศคลาส ดงน
ชอคลาส
คณสมบตของคลาส
พฤตกรรมของคลาส
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) }; ชอคลาส::ชอคอนสตรทเทอร { // ชดค าสง; } ชนดขอมลชอคลาส::ชอเมธอด { // ชดค าสง; }
182
2. ในหนาตางเพมไอเทมใหม (Add New Item) ใหเลอกทเฮดเดอรไฟล จากนนใหพมพ ชอเฮเดอรไฟลทตองการลงไปในชองชอ แลวคลกทป ม Add ดงภาพท 8.4
ภาพท 8.4 หนาตางเพมไอเทมใหม
3. หลงจากท าในขอท 2 จะไดเฮดเดอรไฟลทสรางขนมา ดงภาพท 8.5 ใหดบเบลคลกทไฟลเฮดเดอรทสรางขนมา แลวท าการเขยนซอรสโคดโปรแกรมตามชดค าสงในตารางท 8.1
ภาพท 8.5 หนาตางการสรางเฮดเดอรไฟล
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 หนาตางการเรยกใชเฮดเดอร
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) โดยมรปแบบการประกาศคอนสตรทเทอร ดงน
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(); // การประกาศดสตรทเทอรใหกบคลาส };
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 }
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
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
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 }
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ชอคลาสหลก
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 }
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; };
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) หมายถง การถายทอดคณสมบตทมความสามารถในการรบการถายทอดได ทงภายในและภายนอกคลาสโดยมรปแบบการประกาศคลาสอนเทอรเฟซ ดงน
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 { ชดค าสง; };
195
โดยมผลลพธทไดดงภาพท 8.16
ภาพท 8.16 ผลลพธการรนโปรแกรมการประกาศคลาสอนเทอรเฟซ
สรป แนวคดของการเขยนโปรแกรมเชงวตถ เรมจากการมองทกสงทกอยางในโลกของความเปนจรงเปนวตถหรอออบเจกต (Object) ทประกอบไปดวยสวนประกอบ 2 สวนคอ คณสมบตหรอแอตทรบวส (Attribute) และพฤตกรรมหรอการกระท า (Operation) โดยขอดของการน าหลกการระบบเชงวตถมาประยกตคอ การน ากลบมาใชใหมได จากแนวคดนท าใหการเขยนเชงวตถเปนทนยมในภาษาสงและถกน ามาใชกนอยางแพรหลาย สงทนกเขยนโปรแกรมควรจะใหความส าคญคอตองศกษาและใหเขาใจคณสมบตของหลกการเชงวตถทประกอบไปดวย การก าหนดขอมลนามธรรมการท าใหขอมลอยในขอบเขตจ ากดหรอการหอหมวตถและการซอนขอมลการถายทอดและท าหลายรปแบบหรอการฟองรปเพราะคณสมบตเหลานจะมประโยชนอยางมากในการพฒนาโปรแกรมเชงวตถ สงส าคญการเขยนโปรแกรมเชงวตถนนจ าเปนตองรและเขาใจแนวคดของคลาสและวตถการสรางคลาส การสรางตวตน สรางคอนสตรทเทอรหรอดสตรทเทอร เปนตน ในเนอหาบทตอไปจะเปนกลาวเกยวการพฒนาภาษาซพลสพลสบนระบบปฏบตการวนโดวส
แบบฝกหด
จงตอบค าถามตอไปน 1. จงออกแบบคลาสพรอมอธบายสวนประกอบตางๆของคลาส 2. จงเขยนรปแบบการประกาศโครงสรางคลาส พรอมอธบาย 3. จงสรางเฮดเดอรไฟลขนมาใหมโดยก าหนดชอเปน “Human” 4. จงเขยนโปรแกรมเพอสรางคลาสโดยให “Human” เปนชอคลาส สวนคณสมบตของ
คลาสมดงน ชอ อาย เพศ และพฤตกรรมของคลาสมดงน แนะน าตวและพฤตกรรมตางๆ 5. จงเขยนโปรแกรมเพอเรยกใชเมธอดและคณสมบตภายในคลาส Human
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.