ดาวน์โหลดงานนำเสนอ
งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ
1
Lec05 :: การสืบทอด (inheritance)
โดย อ. นัฐพงศ์ ส่งเนียม เขียนโปรแกรม Java เบื้องต้น
2
หัวข้อ การสืบทอด การเข้าใช้แบบ protected พอลิมอร์ฟิซึม
การสืบทอดในภาษาจาวา คลาส Object
3
การสืบทอด
4
สัตว์ต่างๆ คลาสแมว คลาสปลา คลาสลิง แอตทริบิวต์ ได้แก่ อายุ และ ความหิว
เมธอด ได้แก่ กิน() และ นอน() คลาสปลา แอตทริบิวต์ ได้แก่ อายุ ความหิว และชื่อ (เช่น ปลานีโม) คลาสลิง เมธอดได้แก่ กิน() นอน() และเก็บลูกมะพร้าว()
5
แอททริบิวท์และเมธอดที่คล้ายกัน
6
การสืบทอด แก้ปัญหาการเขียนโปรแกรมซ้ำซ้อนกันได้
เมธอดหรือแอตทริบิวต์ที่คลาสต่างๆ มีร่วมกันจะถูกนำไปใส่ในคลาสแม่ คลาสลูกจะสืบทอดเมธอดและแอตทริบิวต์คลาสแม่โดยอัตโนมัติ
7
การทดสอบการสืบทอด แต่งประโยคโดยใช้คำว่า “เป็น” เข้าช่วย ลิงเป็นสัตว์
สัตว์เป็นลิง ลิงไซบอร์ก เป็น ลิงและหุ่นยนต์ รถยนต์เป็นพาหนะ เครื่องยนต์เป็นรถยนต์
8
คลาสสัตว์ แมว ปลา และลิง เป็นสัตว์ สัตว์ทุกตัวสามารถกินและนอนได้ เราจึงนำแอตทริบิวต์และเมธอดที่สัตว์ต่างๆมีร่วมกัน ไปใส่ในคลาสสัตว์ class สัตว์ { // แอตทริบิวต์ อายุ; ความหิว; // เมธอด กิน() {… } นอน() {… } }
9
การสืบทอด รูปแบบ ตัวอย่าง class คลาสลูก extends คลาสแม่
} class ปลา extends สัตว์ { class ลิง extends สัตว์ {
10
วัตถุในคลาสลูกสามารถทำงานตามเมธอดของคลาสแม่ได้
ลิง ล = new ลิง(); ล.กิน();
11
เพิ่มเมธอดในคลาสลูก class ลิง extends สัตว์ { // เมธอดที่เพิ่มเข้ามา
เก็บลูกมะพร้าว() { … } } ลิง ล = new ลิง(); ล.เก็บลูกมะพร้าว(); สัตว์ ส = new สัตว์(); ส.เก็บลูกมะพร้าว();
12
เพิ่มแอททริบิวท์ในคลาสลูก
class ปลา extends สัตว์ { // แอตทริบิวต์ที่เพิ่มเข้ามา ชื่อ; }
13
พอลิมอร์ฟิซึม (Polymorphism)
14
การโอเวอร์ไรด์เมธอด class ปลา extends สัตว์ { // แอตทริบิวต์ ชื่อ;
// เมธอด นอน() { // วิธีการนอนของปลา … }
15
พอลิมอร์ฟิซึม
16
ความหมาย poly แปลว่าหลายหรือมาก
morphism นั้นมาจากคำว่า morph ซึ่งแปลว่ารูปร่าง รวมกันแล้วหมายถึงความสามารถที่สิ่งหนึ่งจะมีได้หลายรูปร่าง ซึ่งเมื่อใช้คำนี้กับการโปรแกรมเชิงวัตถุ ก็จะหมายถึงการที่คำสั่งแบบเดียวกันสามารถถูกแปลได้หลายแบบ
17
พอลิมอร์ฟิซึมกับการนำกลับมาใช้ใหม่
พอลิมอร์ฟิซึมสนับสนุน การนำกลับมาใช้ใหม่ (reuse) ถ้าเราได้เขียนโปรแกรมที่ใช้งานได้กับสัตว์ โปรแกรมของเราย่อมใช้ได้กับแมว ปลา และลิงนอกจากนั้นถ้ามีคนสร้างคลาสอีกัวน่าขึ้นมาใหม่ โปรแกรมที่เราเขียนก็สามารถใช้ได้กับคลาสอีกัวน่าเช่นกัน
18
การสืบทอดในภาษาจาวา
19
คลาสรูปร่างและคลาสที่สืบทอด
20
คลาสรูปร่าง รูปร่างเป็นรูปที่อยู่ในระนาบสองมิติ มีพื้นที่ มีสี
เมธอด getArea() ใช้คำนวณหาพื้นที่ของรูปร่าง มีสี public enum Color { Red, Green, Blue } เมธอด getColor()
21
คลาสรูปร่าง public class Shape { public Shape() { color = Color.Red; }
public double getArea() { return 0; } public void setColor(Color c) { color = c; } public Color getColor() { return color; } private Color color; }
22
ทดสอบคลาสรูปร่าง public class TestShape {
public static void main(String[] args) { Shape s1 = new Shape(); System.out.println(s1.getColor()); System.out.println(s1.getArea()); Shape s2 = new Shape(); s2.setColor(Color.Blue); System.out.println(s2.getColor()); System.out.println(s2.getArea()); }
23
คอมไพล์และรัน
24
คลาสสี่เหลี่ยมผืนผ้า
class Rectangle extends Shape { ... public double getArea() { return width * height; }
25
คลาส Object
26
เมธอด 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; }
27
เมธอด toString() เป็นเมธอดที่ถูกโอเวอร์ไรด์จากคลาส Object
28
คลาส Object แม่ของทุกคลาส เมธอดที่น่าสนใจ toString() equals() clone()
hashCode()
29
เมธอด equals() public boolean equals(Object otherObject) {
if (otherObject instanceof Rectangle) { Rectangle otherRect = (Rectangle) otherObject; boolean equalWidth = width == otherRect.width; boolean equalHeight = height == otherRect.height; return equalWidth && equalHeight; } return false;
30
เมธอด hashCode() จะส่งจำนวนเต็มที่เป็นรหัสแฮช เพื่อการค้นหาข้อมูลที่รวดเร็ว public int hashCode() { return (int) (width + height * 17); }
31
เมธอด clone() สร้างวัตถุที่เหมือนกับวัตถุที่ได้รับข้อความ
public Object clone() { Rectangle clone = new Rectangle(width, height); return clone; }
32
ทดสอบเมธอดที่โอเวอร์ไรด์จากคลาส Object
public class TestRectangle3 { public static void main(String[] args) { Rectangle r1 = new Rectangle(2, 5); System.out.println(r1); System.out.println(r1.hashCode()); Rectangle r2 = new Rectangle(5, 2); System.out.println(r1.equals(r2)); Rectangle r3 = (Rectangle) r1.clone(); System.out.println(r1.equals(r3)); }
33
สรุปเมธอดในคลาสสี่เหลี่ยมผืนผ้า
34
การห้ามโอเวอร์ไรด์
35
คลาสสี่เหลี่ยมจัตุรัส
public class Square extends Rectangle { public Square( double w) { super(w,w); } ...
36
ไฟนอลคลาส ไม่สามารถถูกสืบทอดได้ public final class Square
37
ไฟนอลเมธอด ไม่สามารถถูกโอเวอร์ไรด์ได้ public class Shape {
public final Color getColor() { return color; } ...
38
การเข้าใช้แบบ protected
39
การเข้าใช้แบบ protected
การเข้าใช้แบบนี้มีความเข้มงวดน้อยกว่าแบบ private ซึ่งห้ามคลาสอื่นใดเข้าใช้ แต่ก็อิสระน้อยกว่าแบบ public ที่ใครๆก็สามารถเข้าใช้ได้
40
การเข้าใช้แบบ protected
41
คลาสวงกลม public class Circle extends Shape { protected double radius;
public Circle(double r) { radius = r; } public double getRadius() { return radius; ...
42
คำนวณพื้นที่ของวงแหวน
public class Ring1 extends Circle { public double getArea() { double outerArea = Math.PI * radius * radius; double innerArea = Math.PI * innerRadius * innerRadius; return outerArea - innerArea; } ...
43
คำนวณพื้นที่ของวงแหวน
public class Ring2 extends Circle { public double getArea() { double outerArea = super.getArea(); double innerArea = Math.PI * innerRadius * innerRadius; return outerArea - innerArea; } ...
44
แอบสแตรกท์คลาส (abstract class)
45
คลาสที่ประกาศขึ้นมาลอยๆ (Abstract Class)
เมธอด getArea() ในคลาส Shape ไม่ควรส่งค่าศูนย์หรือค่าใดๆกลับมา ทั้งนี้เพราะว่าเราไม่ทราบวิธีคำนวณหาพื้นที่ของวัตถุ Shape public abstract double getArea(); เมธอดที่ถูกประกาศขึ้นมาลอยๆ (abstract) นี้ต้องอยู่ในคลาสที่เป็น abstract ด้วยเช่นกัน คลาส Shape เขียนใหม่ได้ดังนี้ public abstract class Shape { ... }
46
การใช้งาน abstract class
ไม่สามารถสร้างวัตถุในคลาสนี้ได้ Shape s = new Shape(); แต่อ้างถึงวัตถุในคลาสลูกได้ Shape s; s = new Rectangle(3,2); s = new Square(5);
47
พอลิมอร์ฟิซึม 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); }
48
การนำมาใช้อีก public class ShapeArray {
public static double sumArea(Shape[] shapes) { double sum = 0; for( Shape s : shapes) { sum += s.getArea(); } return sum;
49
การนำมาใช้อีก 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);
50
ข้อดีข้อเสียของการสืบทอด
51
ข้อดีของการสืบทอด การนำกลับมาใช้ใหม่ ความเป็นมาตรฐานเดียวกัน
ถ้าเราต้องการสร้างคลาสที่มีความสามารถคล้ายๆกับคลาสที่มีอยู่แล้ว เราอาจจะใช้การสืบทอดแทนที่จะเขียนขึ้นมาใหม่หมด ความเป็นมาตรฐานเดียวกัน คลาสพื้นฐานเป็นการกำหนดโครงแบบในการระบุความสามารถของวัตถุในคลาสลูก เข้าใจสาระสำคัญได้ง่าย
52
ข้อเสียของการสืบทอด
โปรแกรมทำงานช้าลง มีค่าใช้จ่าย (overhead) ในค้นหาและเรียกใช้เมธอดของคลาสที่สืบทอด แต่ค่าใช้จ่ายดังกล่าวถือว่าน้อยมากเมื่อเทียบกับประโยชน์ที่ได้รับจากการสืบทอด โปรแกรมมีขนาดใหญ่ขึ้น แต่หน่วยความจำราคาไม่แพง ความซับซ้อนเพิ่มขึ้น ผู้ใช้ต้องหาตามคลาสต่างๆ ที่อยู่ในผังการสืบทอดจนกว่าจะพบคลาสที่อิมพลีเมนต์เมธอดนั้น ปัญหาที่กล่าวถึงนี้มีชื่อว่าปัญหาลูกดิ่ง (Yo-yo problem)
53
สรุป
54
สรุป การสืบทอดในภาษาจาวาใช้แนวความคิดเดียวกับการถ่ายทอดคุณลักษณะจากพ่อและแม่ คลาสลูกสืบทอดความสามารถจากคลาสแม่ การทดสอบการสืบทอดทำได้โดยการแต่งประโยคที่มีคำว่าเป็น การสืบทอดทำให้เกิดการนำไปใช้ใหม่ได้ คลาสลูกสามารถใช้เมธอดในคลาสแม่ได้ ถ้าเมธอดนั้นเป็น public หรือ protected
55
สรุป เมธอดที่ใช้กับคลาสแม่ได้ ก็สามารถใช้กับคลาสลูกได้
คลาสลูกสามารถโอเวอร์ไรด์เมธอดในคลาสแม่ได้ พอลิมอร์ฟิซึมคือการที่คำสั่งเดียวกันสามารถทำให้เกิดการทำงานที่ต่างกันขึ้นกับชนิดของวัตถุ แอ็บสแตร็กต์เมธอดคือเมธอดที่ไมได้ระบุวิธีการทำงาน แอ็บสแตร็กต์เมธอดต้องอยู่ในแอ็บสแตร็กต์คลาส แอ็บสแตร็กต์คลาสเป็นเหมือนกับโครงที่กำหนดให้คลาสลูกต้องอิมพลีเมนต์แอ็บสแตร็กต์เมธอด
งานนำเสนอที่คล้ายกัน
© 2024 SlidePlayer.in.th Inc.
All rights reserved.