270 likes | 407 Views
ครั้ง ที่ 7 Composition. ภาพรวมเนื้อหา. หลักการ composition การประกาศและสร้าง attribute ที่เป็น object Method ที่รับพารามิเตอร์เป็น object Method ที่คืนค่าเป็น object. Composition ( การประกอบ ). เป็นการสร้างคลาสใหม่ที่มี attribute เป็น object จากคลาสอื่น
E N D
ภาพรวมเนื้อหา • หลักการ composition • การประกาศและสร้าง attribute ที่เป็น object • Method ที่รับพารามิเตอร์เป็น object • Method ที่คืนค่าเป็น object
Composition (การประกอบ) • เป็นการสร้างคลาสใหม่ที่มี attribute เป็น object จากคลาสอื่น • เช่น คลาสรถยนต์ จะประกอบด้วยคลาสเครื่องยนต์ คลาสล้อ เป็นต้น • Composition ไม่เหมือนกับ inheritance • คลาสเหล่านั้นไม่ได้มีความสัมพันธ์กัน ต่างก็เป็นอิสระจากกัน • แต่สามารถเรียกใช้ attribute หรือ method ของคลาสที่มาประกอบกันได้ (เสมือนว่ามันมีความสัมพันธ์กัน)
ตัวอย่าง • คลาสนิสิตมหาวิทยาลัยบูรพา (class BuuStudent) อาจประกอบขึ้นมาจาก • คลาสข้อมูลส่วนตัว (class Personal) • คลาสคณะ (class Faculty) class BuuStudent class BuuStudent Class Personal Class Faculty class Faculty class Personal
ตัวอย่าง • การเขียนคลาสรถยนต์ ที่ประกอบขึ้นมาจากคลาสอื่นๆ
ข้อดีของ composition • ทำให้ง่ายต่อการพัฒนาโปรแกรมเชิงวัตถุ เพราะคลาสที่เคยสร้างไว้สามารถถูกนำไปใช้ใหม่ • แต่ละคลาสที่มาประกอบรวมกันเกิดเป็นคลาสใหม่ จะมีการทำงานที่เป็นอิสระ แยกจากกัน ไม่ขึ้นกับ object ของคลาสอื่นๆ • การพัฒนาโปรแกรมมีความยืดหยุ่น เช่น คลาสรถยนต์สามารถเปลี่ยน object ของล้อ ตามยี่ห้อรถยนต์ที่แตกต่างกันได้ • โปรแกรมมีการทำงานที่แบ่งเป็นส่วนย่อย ทำให้สามารถแก้ไขปรับปรุงในแต่ละส่วนย่อย โดยไม่ส่งผลต่อการทำงานในส่วนอื่นๆ
ตัวอย่างการเขียนคลาสแบบ composition คลาส ข้อมูลส่วนตัว (PersonalInfo) ประกอบขึ้นมาจาก คลาส Person ซึ่งจะเก็บข้อมูล ชื่อ นามสกุล คลาส Date ซึ่งจะเก็บข้อมูล วัน เดือน ปี
Implement class Person public class Person { private String firstName; private String lastName; public Person() { firstName =""; lastName =""; } public Person(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public String getLastName() { return lastName; }
Implement class Person public String getFirstName() { return firstName; } public void setName(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public void print(){ System.out.println(firstName + “ ” + lastName); } }
Implement class Date public class Date { private intdMonth; private intdDay; private intdYear; public Date() { dMonth = 1; dDay = 1; dYear = 1900; } public Date(intdMonth, intdDay, intdYear) { this.dMonth = dMonth; this.dDay = dDay; this.dYear = dYear; }
Implement class Date public intgetdYear() { return dYear; }public intgetdMonth() { return dMonth; } public intgetdDay() { return dDay; } public void setDate(intdDay, intdMonth, intdYear) { this.dDay = dDay; this.dMonth = dMonth; this.dYear = dYear; } public void print(){ System.out.println(dMonth + "-"+dDay+"-"+dYear); } }
Implement class PersonalInfoอย่างไร จะประกาศ attribute นี้อย่างไรดี
การประกาศและสร้าง attribute ที่เป็น object • รูปแบบการประกาศ attribute [modifier] type ชื่อattribute ; [int , double , boolean , char , String] • ไม่แปลกอะไร ถ้า type ของ attribute จะมีชนิดเป็นคลาส public Data d; // attribute ชื่อ d มีชนิดเป็นคลาส Data (ใน code เราต้องมีการสร้างคลาส Data เอาไว้)
การประกาศและสร้าง attribute ที่เป็น object • public Data d; // เป็นแค่การประกาศตัวแปร ยังไม่มี object เกิดขึ้น แสดงว่ายังใช้งานไม่ได้ • จะใช้งานได้เราต้องสร้าง object ขึ้นมา • ทำไปพร้อมกันในบรรทัดเดียวเลย public Data d = new Data(); • ทำทีหลังใน constructor public class Box { public Data d; public Box() { d = new Data(); } }
ตัวอย่าง public class Box { public double v; public Data d = new Data(); public Box(){ } public Box(double v , Data d){ this.v = v; this.d = d; } public void show(){ System.out.println("v : "+v); System.out.println("d.x "+d.x); } } public class Data { public int x ; } ไม่ได้มีความสัมพันธ์เป็นแม่ลูกกัน แต่เรียกใช้ attribute ของคลาส Data ได้
Method ที่รับพารามิเตอร์เป็น object • ในการเขียนโปรแกรมบางครั้ง พารามิเตอร์ของ method อาจจะไม่ต้องการแค่ข้อมูลธรรมดา • แต่ต้องการข้อมูลของทั้ง object เพื่อมาดำเนินการอะไรบางอย่าง • หากเรามองว่า class ที่เราสร้างขึ้นเปรียบเสมือนเป็นชนิดของตัวแปรแบบใหม่ นอกเหนือจากชนิดข้อมูลพื้นฐานที่มีอยู่ในภาษาจาวา • เราจะสามารถดำเนินการรับค่า หรือ คืนค่าข้อมูลที่เป็น object ได้เหมือนกับข้อมูลปกติที่เคยทำมา
ตัวอย่าง public class Data { public int x; public boolean isEq1(int n){ //รับค่าเพียงแค่ค่าเดียว return x == n; } public boolean isEq2(Data d) { return x == d.x; } } รับทั้งก้อน object เข้ามา (ได้ทั้ง attribute และ method ของ object d)
Method ที่คืนค่าเป็น object public class Data { public int x; public intgetX(){ return x; } public Data getData(){ Data d = new Data(2); return d; } } คืนค่าข้อมูลในรูปแบบ object เปรียบเหมือนเป็นการคืนข้อมูลออกไปทั้งก้อน ผู้รับสามารถใช้ได้ทั้ง attribute และ method ของตัวแปรอ้างอิง d
Implement class PersonalInfo สร้าง object ของคลาส Person และ คลาส Date จะทำให้เราสามารถเรียกใช้งาน attribute และ method ต่างๆ ได้ public class PersonalInfo { Person name = new Person(); Date bDay = new Date(); intpersonID; public PersonalInfo() { } public PersonalInfo(String first,String last, intdDay, intdMonth, intdYear, intpersonID) { } public void setPersonalInfo(String first,String last, intdDay, intdMonth, intdYear, intpersonID) { } public void print(){ System.out.println ("Name: "+name.toString()); System.out.println ("Date of birth: "+bDay.toString()); System.out.println ("Personal ID: "+personID); } } เราสามารถเรียกใช้งาน attribute และ method ต่างๆ ของคลาส Person และ Date ได้ผ่านทาง object ที่สร้าง
Implement class Test public class Test { public static void main(String[] args) { PersonalInfo pi = new PersonalInfo("Somchai","Rakchat",10,12,1977,9999); pi.print(); } } ผลลัพธ์ของโปรแกรม
สรุป • Composition คือ การสร้างคลาสใหม่ที่ประกอบขึ้นจากคลาสที่เราเคยสร้างไว้ • เคยสร้างคลาส Person และ คลาส Date ไว้ • เมื่อจะสร้างคลาส PersonalInfoก็สร้างโดยให้ประกอบขึ้นมาจากสองคลาสนี้ • Attribute ของคลาส PersonalInfo คือ object ของคลาสที่จะนำมาประกอบรวมกันเกิดเป็นคลาสนี้ขึ้น • Person name = new Person(); • Date bDay = new Date();
สรุป • การเรียกใช้งาน attribute ที่ประกาศเป็น object (ถ้าตัวแปรของคลาสเป็น public ก็ใช้ได้เลย ถ้าเป็น private ต้องทำผ่าน getter/ setter method) ดังตัวอย่าง • name.setFirstName(first); • name.setLastName(last); • bDay.setdDay(dDay); • bDay.setdMonth(dMonth); • bDay.setdYear(dYear); ใช้งาน attribute ของคลาส Person ผ่าน object name ใช้งาน attribute ของคลาส Date ผ่าน object bDay
สรุป • การเรียกใช้งาน method ของ attribute ที่ประกาศเป็น object (ตัวอย่างการเรียกใช้ method ของคลาส Person และ คลาส Date) • System.out.println ("Name: "+name.print()); • System.out.println("Date of birth: "+bDay.print());
สรุป • นอกเหนือจากข้อมูลที่ได้มาจากคลาสที่นำมาประกอบกัน • คลาสใหม่ก็สามารถมีข้อมูลเพิ่มเติม ของตนเองได้ เช่น intpersonID;// เป็นตัวแปรของคลาส PersonalInfoเอง • ในทำนองเดียวกัน คลาสใหม่จะมี method ของตนเอง เพิ่มเติมกี่ method ก็ได้
กิจกรรมส่งท้าย พิจารณาโปรแกรมต่อไปนี้ แล้วตอบคำถาม public class Test { public static void main(String[] args) { PersonalInfo pi = new PersonalInfo("Somchai","Rakchat",10,12,1977,9999); pi.print(); } } • จาก object pi ที่ method main ถ้าเราต้องการเปลี่ยนวันเดือนปีเกิดเป็น 09-04-1900 จะต้องเขียนคำสั่งอย่างไร • จาก object pi ที่ method main ถ้าเราต้องการเปลี่ยน ID ของพนักงานเป็น 1234 จะทำได้อย่างไร