งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

Lec05 :: การสืบทอด (inheritance) โดย อ. นัฐพงศ์ ส่งเนียม

งานนำเสนอที่คล้ายกัน


งานนำเสนอเรื่อง: "Lec05 :: การสืบทอด (inheritance) โดย อ. นัฐพงศ์ ส่งเนียม"— ใบสำเนางานนำเสนอ:

1 Lec05 :: การสืบทอด (inheritance) โดย อ. นัฐพงศ์ ส่งเนียม

2 หัวข้อ  การสืบทอด  การเข้าใช้แบบ protected  พอลิมอร์ฟิซึม  การสืบทอดในภาษาจาวา  คลาส Object

3 การสืบทอด

4 สัตว์ต่างๆ  คลาสแมว แอตทริบิวต์ ได้แก่ อายุ และ ความหิว เมธอด ได้แก่ กิน() และ นอน()  คลาสปลา แอตทริบิวต์ ได้แก่ อายุ ความหิว และชื่อ (เช่น ปลานีโม) เมธอด ได้แก่ กิน() และ นอน()  คลาสลิง แอตทริบิวต์ ได้แก่ อายุ และ ความหิว เมธอดได้แก่ กิน() นอน() และเก็บลูกมะพร้าว()

5 แอททริบิวท์และเมธอดที่คล้ายกัน

6 การสืบทอด  แก้ปัญหาการเขียนโปรแกรมซ้ำซ้อนกันได้  เมธอดหรือแอตทริบิวต์ที่คลาสต่างๆ มีร่วมกันจะถูก นำไปใส่ในคลาสแม่  คลาสลูกจะสืบทอดเมธอดและแอตทริบิวต์คลาสแม่ โดยอัตโนมัติ

7 การทดสอบการสืบทอด  แต่งประโยคโดยใช้คำว่า “เป็น” เข้าช่วย ลิงเป็นสัตว์ สัตว์เป็นลิง ลิงไซบอร์ก เป็น ลิงและหุ่นยนต์ รถยนต์เป็นพาหนะ เครื่องยนต์เป็นรถยนต์

8 คลาสสัตว์  แมว ปลา และลิง เป็นสัตว์ สัตว์ทุกตัวสามารถกิน และนอนได้ เราจึงนำแอตทริบิวต์และเมธอดที่สัตว์ ต่างๆมีร่วมกัน ไปใส่ในคลาสสัตว์ class สัตว์ { // แอตทริบิวต์ อายุ; ความหิว; // เมธอด กิน() {… } นอน() {… } }

9 การสืบทอด  รูปแบบ class คลาสลูก extends คลาสแม่  ตัวอย่าง 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; }

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 ได้  คลาสที่อยู่ในแพ็คเกจเดียวกันก็สามารถใช้เมธอด และแอททริบิวท์ที่มีการเข้าใช้แบบ 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 { public abstract double getArea();... }

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); System.out.println(shape.getArea()); }

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 สรุป  เมธอดที่ใช้กับคลาสแม่ได้ ก็สามารถใช้กับคลาสลูกได้  คลาสลูกสามารถโอเวอร์ไรด์เมธอดในคลาสแม่ได้  พอลิมอร์ฟิซึมคือการที่คำสั่งเดียวกันสามารถทำให้เกิดการ ทำงานที่ต่างกันขึ้นกับชนิดของวัตถุ  แอ็บสแตร็กต์เมธอดคือเมธอดที่ไมได้ระบุวิธีการทำงาน  แอ็บสแตร็กต์เมธอดต้องอยู่ในแอ็บสแตร็กต์คลาส  แอ็บสแตร็กต์คลาสเป็นเหมือนกับโครงที่กำหนดให้คลาสลูก ต้องอิมพลีเมนต์แอ็บสแตร็กต์เมธอด


ดาวน์โหลด ppt Lec05 :: การสืบทอด (inheritance) โดย อ. นัฐพงศ์ ส่งเนียม

งานนำเสนอที่คล้ายกัน


Ads by Google