การสืบทอด (inheritance) 09/04/60 เขียนโปรแกรม Java เบื้องต้น เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น หัวข้อ การสืบทอด การเข้าใช้แบบ protected พอลิมอร์ฟิซึม การสืบทอดในภาษาจาวา คลาส Object 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น การสืบทอด 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น สัตว์ต่างๆ คลาสแมว แอตทริบิวต์ ได้แก่ อายุ และ ความหิว เมธอด ได้แก่ กิน() และ นอน() คลาสปลา แอตทริบิวต์ ได้แก่ อายุ ความหิว และชื่อ (เช่น ปลานีโม) คลาสลิง เมธอดได้แก่ กิน() นอน() และเก็บลูกมะพร้าว() 09/04/60 เขียนโปรแกรม Java เบื้องต้น
แอททริบิวท์และเมธอดที่คล้ายกัน 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น การสืบทอด แก้ปัญหาการเขียนโปรแกรมซ้ำซ้อนกันได้ เมธอดหรือแอตทริบิวต์ที่คลาสต่างๆ มีร่วมกันจะถูกนำไปใส่ในคลาสแม่ คลาสลูกจะสืบทอดเมธอดและแอตทริบิวต์คลาสแม่โดยอัตโนมัติ 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น การทดสอบการสืบทอด แต่งประโยคโดยใช้คำว่า “เป็น” เข้าช่วย ลิงเป็นสัตว์ สัตว์เป็นลิง ลิงไซบอร์ก เป็น ลิงและหุ่นยนต์ รถยนต์เป็นพาหนะ เครื่องยนต์เป็นรถยนต์ 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น คลาสสัตว์ แมว ปลา และลิง เป็นสัตว์ สัตว์ทุกตัวสามารถกินและนอนได้ เราจึงนำแอตทริบิวต์และเมธอดที่สัตว์ต่างๆมีร่วมกัน ไปใส่ในคลาสสัตว์ class สัตว์ { // แอตทริบิวต์ อายุ; ความหิว; // เมธอด กิน() {… } นอน() {… } } 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น ทดสอบคลาส ในแต่ละคู่ต่อไปนี้ให้เลือกว่าคลาสใดเป็นแม่ของอีกคลาส ที่สามารถสืบทอดกันได้ ผู้จัดการ พนักงาน รูปสี่เหลี่ยม รูปหลายเหลี่ยม บานาน่าโบ้ต พาหนะ ซีพียู คอมพิวเตอร์ เครื่องเขียน ปากกา ดินสอ ปากกา นก เพนกวิน 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น การสืบทอด รูปแบบ class คลาสลูก extends คลาสแม่ ตัวอย่าง class แมว extends สัตว์ { } class ปลา extends สัตว์ { class ลิง extends สัตว์ { 09/04/60 เขียนโปรแกรม Java เบื้องต้น
วัตถุในคลาสลูกสามารถทำงานตามเมธอดของคลาสแม่ได้ ลิง ล = new ลิง(); ล.กิน(); 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น เพิ่มเมธอดในคลาสลูก class ลิง extends สัตว์ { // เมธอดที่เพิ่มเข้ามา เก็บลูกมะพร้าว() { … } } ลิง ล = new ลิง(); ล.เก็บลูกมะพร้าว(); สัตว์ ส = new สัตว์(); ส.เก็บลูกมะพร้าว(); 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เพิ่มแอททริบิวท์ในคลาสลูก class ปลา extends สัตว์ { // แอตทริบิวต์ที่เพิ่มเข้ามา ชื่อ; } 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น ทดสอบคลาส วาดลำดับชั้นของการสืบทอดคลาสต่อไปนี้ นักศึกษา คน อาจารย์ พนักงาน ศาสตราจารย์ นักศึกษาฝึกสอน 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เมธอดที่มีชื่อซ้ำกับเมธอดในคลาสแม่ ถึงแม้การ กิน() นอน() เป็นความสามารถของสัตว์ทุกชนิดทำได้เหมือนกัน แต่ไม่ได้หมายความว่าสัตว์ทุกชนิดจะมีวิธีการ กิน() นอน() ในแบบเดียวกัน เช่น ปลานอนโดยไม่หลับตา ในขณะที่สัตว์ทั่วไปนอนหลับตา เป็นต้น การเขียนเมธอดที่มีชื่อและพารามิเตอร์เหมือนกันกับเมธอดที่มีอยู่แล้วในคลาสแม่ เรียกว่า “การโอเวอร์ไรด์(override) 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น การโอเวอร์ไรด์เมธอด class ปลา extends สัตว์ { // แอตทริบิวต์ ชื่อ; // เมธอด นอน() { // วิธีการนอนของปลา … } 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น การโอเวอร์ไรด์เมธอด ปลา ป = new ปลา(); ป.นอน(); เช่น ถ้าสั่งให้ปลานอน ปลาจะเข้าไปทำงานตามคำสั่งในเมธอด นอน() ในคลาสปลา ไม่ใช่เมธอด นอน() ในคลาสแม่ 09/04/60 เขียนโปรแกรม Java เบื้องต้น
พอลิมอร์ฟิซึม (Polymorphism) 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น ความหมาย poly แปลว่าหลายหรือมาก morphism นั้นมาจากคำว่า morph ซึ่งแปลว่ารูปร่าง รวมกันแล้วหมายถึงความสามารถที่สิ่งหนึ่งจะมีได้หลายรูปร่าง ซึ่งเมื่อใช้คำนี้กับการโปรแกรมเชิงวัตถุ ก็จะหมายถึงการที่คำสั่งแบบเดียวกันสามารถถูกแปลได้หลายแบบ 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น พอลิมอร์ฟิซึม 09/04/60 เขียนโปรแกรม Java เบื้องต้น
พอลิมอร์ฟิซึมกับการนำกลับมาใช้ใหม่ พอลิมอร์ฟิซึมสนับสนุน การนำกลับมาใช้ใหม่ (reuse) ถ้าเราได้เขียนโปรแกรมที่ใช้งานได้กับสัตว์ โปรแกรมของเราย่อมใช้ได้กับแมว ปลา และลิงนอกจากนั้นถ้ามีคนสร้างคลาสอีกัวน่าขึ้นมาใหม่ โปรแกรมที่เราเขียนก็สามารถใช้ได้กับคลาสอีกัวน่าเช่นกัน 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น พอลิมอร์ฟิซึม public class TestPolymorphism { public static void main(String[] args) { Shape shape; shape = new Rectangle(10, 20); System.out.println(shape.getArea()); shape = new Circle(10); } 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น การนำมาใช้อีก public class ShapeArray { public static double sumArea(Shape[] shapes) { double sum = 0; for( Shape s : shapes) { sum += s.getArea(); } return sum; 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น การนำมาใช้อีก Shape[] s = new Shape[3]; s[0] = new Triangle(10); s[1] = new Rectangle(10,20); s[2] = new Pentagon(20); double d = ShapeArray.sumArea(s); 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น การสืบทอดในภาษาจาวา 09/04/60 เขียนโปรแกรม Java เบื้องต้น
คลาสรูปร่างและคลาสที่สืบทอด 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น คลาสรูปร่าง รูปร่างเป็นรูปที่อยู่ในระนาบสองมิติ มีพื้นที่ เมธอด getArea() ใช้คำนวณหาพื้นที่ของรูปร่าง มีสี public enum Color { Red, Green, Blue } เมธอด getColor() 09/04/60 เขียนโปรแกรม Java เบื้องต้น
คลาสสี่เหลี่ยมผืนผ้า class Rectangle extends Shape { ... public double getArea() { return width * height; } 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น คลาส Object 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น เมธอด toString() public class Rectangle extends Shape { ... public String toString() { String str = "Rectangle"; str += " color=" + getColor(); str += " width=" + width; str += " height=" + height; str += " area=" + getArea(); return str; } 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น เมธอด toString() เป็นเมธอดที่ถูกโอเวอร์ไรด์จากคลาส Object 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น การห้ามโอเวอร์ไรด์ 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น ไฟนอลคลาส ไม่สามารถถูกสืบทอดได้ public final class Square 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น ไฟนอลเมธอด ไม่สามารถถูกโอเวอร์ไรด์ได้ public class Shape { public final Color getColor() { return color; } ... 09/04/60 เขียนโปรแกรม Java เบื้องต้น
การเข้าใช้แบบ protected 09/04/60 เขียนโปรแกรม Java เบื้องต้น
การเข้าใช้แบบ protected การเข้าใช้แบบนี้มีความเข้มงวดน้อยกว่าแบบ private ซึ่งห้ามคลาสอื่นใดเข้าใช้ แต่ก็อิสระน้อยกว่าแบบ public ที่ใครๆก็สามารถเข้าใช้ได้ 09/04/60 เขียนโปรแกรม Java เบื้องต้น
การเข้าใช้แบบ Protected คลาสลูกสามารถเรียกใช้แอทริบิวส์หรือเมธอดที่มีการเข้าใช้แบบ protected ได้ เช่น ถ้าเรากำหนดให้แอทริบิวส์ “อายุ” มีการเข้าใช้แบบ protected แล้ว เมธอด ทำให้แก่() ในคลาสลิงก็สามารถเพิ่มอายุได้ 09/04/60 เขียนโปรแกรม Java เบื้องต้น
การเข้าใช้แบบ Protected Class สัตว์ { protected อายุ; … } Class ลิง extends สัตว์ { ทำให้แก่(){ อายุ +=10; สามารถเข้าใช้แอทริบิวส์ในคลาสแม่ได้ 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น คลาสวงกลม public class Circle extends Shape { protected double radius; public Circle(double r) { radius = r; } public double getRadius() { return radius; ... 09/04/60 เขียนโปรแกรม Java เบื้องต้น
คำนวณพื้นที่ของวงแหวน public class Ring1 extends Circle { public double getArea() { double outerArea = Math.PI * radius * radius; double innerArea = Math.PI * innerRadius * innerRadius; return outerArea - innerArea; } ... 09/04/60 เขียนโปรแกรม Java เบื้องต้น
แอบสแตรกท์คลาส (abstract class) 09/04/60 เขียนโปรแกรม Java เบื้องต้น
คลาสที่ประกาศขึ้นมาลอยๆ (Abstract Class) เมธอด getArea() ในคลาส Shape ไม่ควรส่งค่าศูนย์หรือค่าใดๆกลับมา ทั้งนี้เพราะว่าเราไม่ทราบวิธีคำนวณหาพื้นที่ของวัตถุ Shape public abstract double getArea(); เมธอดที่ถูกประกาศขึ้นมาลอยๆ (abstract) นี้ต้องอยู่ในคลาสที่เป็น abstract ด้วยเช่นกัน คลาส Shape เขียนใหม่ได้ดังนี้ public abstract class Shape { ... } 09/04/60 เขียนโปรแกรม Java เบื้องต้น
การใช้งาน abstract class ไม่สามารถสร้างวัตถุในคลาสนี้ได้ Shape s = new Shape(); แต่อ้างถึงวัตถุในคลาสลูกได้ Shape s; s = new Rectangle(3,2); s = new Square(5); 09/04/60 เขียนโปรแกรม Java เบื้องต้น
ข้อดีข้อเสียของการสืบทอด 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น ข้อดีของการสืบทอด การนำกลับมาใช้ใหม่ ถ้าเราต้องการสร้างคลาสที่มีความสามารถคล้ายๆกับคลาสที่มีอยู่แล้ว เราอาจจะใช้การสืบทอดแทนที่จะเขียนขึ้นมาใหม่หมด ความเป็นมาตรฐานเดียวกัน คลาสพื้นฐานเป็นการกำหนดโครงแบบในการระบุความสามารถของวัตถุในคลาสลูก เข้าใจสาระสำคัญได้ง่าย 09/04/60 เขียนโปรแกรม Java เบื้องต้น
ข้อเสียของการสืบทอด โปรแกรมทำงานช้าลง มีค่าใช้จ่าย (overhead) ในค้นหาและเรียกใช้เมธอดของคลาสที่สืบทอด แต่ค่าใช้จ่ายดังกล่าวถือว่าน้อยมากเมื่อเทียบกับประโยชน์ที่ได้รับจากการสืบทอด โปรแกรมมีขนาดใหญ่ขึ้น แต่หน่วยความจำราคาไม่แพง ความซับซ้อนเพิ่มขึ้น ผู้ใช้ต้องหาตามคลาสต่างๆ ที่อยู่ในผังการสืบทอดจนกว่าจะพบคลาสที่อิมพลีเมนต์เมธอดนั้น ปัญหาที่กล่าวถึงนี้มีชื่อว่าปัญหาลูกดิ่ง (Yo-yo problem) 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น สรุป 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น สรุป การสืบทอดในภาษาจาวาใช้แนวความคิดเดียวกับการถ่ายทอดคุณลักษณะจากพ่อและแม่ คลาสลูกสืบทอดความสามารถจากคลาสแม่ การทดสอบการสืบทอดทำได้โดยการแต่งประโยคที่มีคำว่าเป็น การสืบทอดทำให้เกิดการนำไปใช้ใหม่ได้ คลาสลูกสามารถใช้เมธอดในคลาสแม่ได้ ถ้าเมธอดนั้นเป็น public หรือ protected 09/04/60 เขียนโปรแกรม Java เบื้องต้น
เขียนโปรแกรม Java เบื้องต้น สรุป เมธอดที่ใช้กับคลาสแม่ได้ ก็สามารถใช้กับคลาสลูกได้ คลาสลูกสามารถโอเวอร์ไรด์เมธอดในคลาสแม่ได้ พอลิมอร์ฟิซึมคือการที่คำสั่งเดียวกันสามารถทำให้เกิดการทำงานที่ต่างกันขึ้นกับชนิดของวัตถุ แอ็บสแตร็กต์เมธอดคือเมธอดที่ไมได้ระบุวิธีการทำงาน แอ็บสแตร็กต์เมธอดต้องอยู่ในแอ็บสแตร็กต์คลาส แอ็บสแตร็กต์คลาสเป็นเหมือนกับโครงที่กำหนดให้คลาสลูกต้องอิมพลีเมนต์แอ็บสแตร็กต์เมธอด 09/04/60 เขียนโปรแกรม Java เบื้องต้น