Inheritance
Download
1 / 70

????????? ( inheritance) - PowerPoint PPT Presentation


  • 127 Views
  • Uploaded on

การสืบทอด ( inheritance). Nerissa Onkhum. Outline. การสืบทอด การเข้าใช้แบบ protected พอลิมอร์ฟิซึม การสืบทอดในภาษาจาวา คลาส Object. การสืบทอด. การสืบทอด ( Inheritance ). ในการโปรแกรมเชิงวัตถุเป็นแนวความคิดที่เลียนแบบจาก การลืบทอดลักษณะของลูกมาจากพ่อและแม่

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about '????????? ( inheritance)' - auberta


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
Inheritance

การสืบทอด (inheritance)

Nerissa Onkhum


Outline
Outline

  • การสืบทอด

  • การเข้าใช้แบบ protected

  • พอลิมอร์ฟิซึม

  • การสืบทอดในภาษาจาวา

  • คลาส Object



Inheritance1
การสืบทอด (Inheritance)

  • ในการโปรแกรมเชิงวัตถุเป็นแนวความคิดที่เลียนแบบจากการลืบทอดลักษณะของลูกมาจากพ่อและแม่

  • การโปรแกรมเชิงวัตถุนำการลืบทอดมาใช้กับคลาสและอินเทอร์เฟส

  • การสืบทอดเกี่ยวข้องกับคลาส 2 คลาส คือคลาสแม่และคลาสลูก

  • คลาสแม่จะถ่ายทอดความสามารถและลักษณะให้กับคลาสลูก

  • คลาสแม่จะนำเสนอแนวความคิดที่กว้างและทั่วไป

  • คลาสลูกจะนำเสนอแนวความคิดที่เฉพาะเจาะจง หรือมีความสามารถเพิ่มเติมจากที่มีอยู่แล้วในคลาสแม่


Inheritance
สัตว์ต่างๆ

  • คลาสแมว

    • แอตทริบิวต์ ได้แก่ อายุ และ ความหิว

    • เมธอด ได้แก่ กิน() และ นอน()

  • คลาสปลา

    • แอตทริบิวต์ ได้แก่ อายุ ความหิว และชื่อ (เช่น ปลานีโม)

    • เมธอด ได้แก่ กิน() และ นอน()

  • คลาสลิง

    • แอตทริบิวต์ ได้แก่ อายุ และ ความหิว

    • เมธอดได้แก่ กิน() นอน() และเก็บลูกมะพร้าว()


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


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

  • แก้ปัญหาการเขียนโปรแกรมซ้ำซ้อนกันได้

  • เมธอดหรือแอตทริบิวต์ที่คลาสต่างๆ มีร่วมกันจะถูกนำไปใส่ในคลาสแม่

  • คลาสลูกจะสืบทอดเมธอดและแอตทริบิวต์คลาสแม่โดยอัตโนมัติ

  • การแก้ไขเปลี่ยนแปลงเมธอดในคลาสแม่จะทำให้คลาสลูกเปลี่ยนตามไปด้วย


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

  • แมว ปลา และลิง เป็นสัตว์ สัตว์ทุกตัวสามารถกินและนอนได้ เราจึงนำแอตทริบิวต์และเมธอดที่สัตว์ต่างๆมีร่วมกัน ไปใส่ในคลาสสัตว์

    class สัตว์ {

    // แอตทริบิวต์

    อายุ;

    ความหิว;

    // เมธอด

    กิน() {… }

    นอน() {… }

    }


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

  • รูปแบบ

    • classคลาสลูกextendsคลาสแม่

  • ตัวอย่าง

    class แมว extends สัตว์ {

    }

    class ปลา extends สัตว์ {

    }

    class ลิง extends สัตว์ {

    }


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

  • แต่งประโยคโดยใช้คำว่า “เป็น” เข้าช่วย

    • ลิงเป็นสัตว์

    • สัตว์เป็นลิง

    • ลิงไซบอร์ก เป็น ลิงและหุ่นยนต์

    • รถยนต์เป็นพาหนะ

class ลิง extends สัตว์

class รถยนต์ extends พาหนะ


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

  • แต่งประโยคโดยใช้คำว่า “เป็น” เข้าช่วย

    • เครื่องยนต์เป็นรถยนต์

      • รถยนต์มีเครื่องยนต์

        class รถยนต์ extends พาหนะ{

        เครื่องยนต์ // แอตทริบิวต์ห

        }


Inheritance
วัตถุในคลาสลูกสามารถทำงานตามเมธอดของคลาสแม่ได้วัตถุในคลาสลูกสามารถทำงานตามเมธอดของคลาสแม่ได้

ลิง ล = new ลิง();

ล.กิน();

คลาสลิงไม่มีเมธอดใด ๆ ประกาศไว้

ล.กิน(); จึงไปทำงานตามเมธอด กิน()

ที่อยู่ในคลาสแม่ (คลาสสัตว์)


Inheritance
วัตถุในคลาสลูกสามารถทำงานตามเมธอดของคลาสแม่ได้วัตถุในคลาสลูกสามารถทำงานตามเมธอดของคลาสแม่ได้

ลิง ล = new ลิง();

ล.กิน();

สรุป คือ ถ้าคลาสลูกไม่ได้เขียนเมธอด กิน()

วัตถุในคลาสลูกจะเข้าไปเรียกใช้

เมธอดกินที่คลาสแม่

ดังนั้น การเปลี่ยนแปลงการทำงานของเมธอดในคลาสแม่ ทำให้การทำงานของลูกทุกคลาสเปลี่ยนแปลงตาม โดยอัตโนมัติ


Inheritance
เพิ่มเมธอดในคลาสลูกวัตถุในคลาสลูกสามารถทำงานตามเมธอดของคลาสแม่ได้

class ลิง extends สัตว์ {

// เมธอดที่เพิ่มเข้ามา

เก็บลูกมะพร้าว() { … }

}

ลิง ล = new ลิง();

ล.เก็บลูกมะพร้าว();

สัตว์ ส = new สัตว์();

ส.เก็บลูกมะพร้าว();

คอมไพล์ผ่าน เพราะเรฟเฟอร์เรนซ์ของลิง สามารถเรียกใช้เมธอดของลิงได้

คอมไพล์ไม่ผ่าน สัตว์โดยทั่วไปไม่รู้วิธีเก็บลูกมะพร้าว


Inheritance
เพิ่มเมธอดในคลาสลูกวัตถุในคลาสลูกสามารถทำงานตามเมธอดของคลาสแม่ได้

สรุป

  • วัตถุในคลาสลูกสามารถเรียกเมธอดจากคลาสแม่ได้

  • แต่วัตถุในคลาสแม่ ไม่สามารถเรียกเมธอดที่ถูกเขียนเพิ่มเติมในคลาสลูกได้

  • การเพิ่มความสามารถในคลาสลูก ทำให้การพัฒนาต่อยอดทำได้ง่ายขึ้น

    • ผู้เขียนโปรแกรมสามารถสร้างคลาสใหม่โดยการสืบทอดจากคลาสเดิม และเขียนเมธอดเพิ่มเติมลงในส่วนที่คลาสเดิมไม่มี


Inheritance
เพิ่มแอททริบิวท์ในคลาสลูกเพิ่มแอททริบิวท์ในคลาสลูก

class ปลา extends สัตว์ {

// แอตทริบิวต์ที่เพิ่มเข้ามา

ชื่อ;

}

  • สามารถประกาศแอตทริบิวต์เพิ่มเติมให้กับคลาสลูกได้


Inheritance
เพิ่มแอททริบิวท์ในคลาสลูกเพิ่มแอททริบิวท์ในคลาสลูก

  • ปกติจะไม่ให้คลาสอื่นเข้าถึงแอตทริบิวต์ได้โดยตรง

    • แอตทริบิวต์ จึงถูกประกาศการเข้าใช้เป็น private

    • การเข้าใช้แบบ private คลาสลูกก็ไม่สามารถเข้าใช้แอตทริบิวต์ได้

      • ตัวอย่างเช่น ถ้าแอตทริบิวต์ “อายุ” ของคลาสสัตว์เป็น private

      • คลาสแมวซึ่งเป็นคลาสลูกของสัตว์ จะไม่สามารถเข้าใช้แอตทริบิวต์ “อายุ” ได้

      • ถ้าอยากให้คลาสลูกใช้งานแอตทริบิวต์ของแม่ได้ ต้องเปลี่ยนระดับการใช้งานเป็น “protected”


Inheritance
เพิ่มแอททริบิวท์ในคลาสลูกเพิ่มแอททริบิวท์ในคลาสลูก

  • protected คือการกำหนดให้คลาสลูกละคลาสในแพ็จเกจเดียวกันสามารถเข้าใช้ได้

  • protected

    • เข้มงวดน้อยกว่า private

    • อิสระน้อยกว่าแบบ public

class สัตว์{

protected อายุ;

}

class ลิง{

ทำให้แก่(){

อายุ +=10;

}

}


Inheritance
เมธอดที่ชื่อซ้ำกับเมธอดในคลาสแม่เมธอดที่ชื่อซ้ำกับเมธอดในคลาสแม่

class ปลา extends สัตว์ {

// แอตทริบิวต์

ชื่อ;

// เมธอด

นอน() {

// วิธีการนอนของปลา

}

}


Inheritance
การโอเวอร์ไรด์เมธอดเมธอดที่ชื่อซ้ำกับเมธอดในคลาสแม่

  • คลาสสัตว์มีเมธอด นอน();

  • เขียนเมธอด นอน(); ซ้ำอีกในคลาสปลา

  • การเขียนเมธอดที่มีชื่อและพารามิเตอร์เหมือนกับ เมธอดเดิมที่มีอยู่ในคลาสแม่ เรียกว่า การโอเวอร์ไรด์ (override)

  • วัตถุในคลาสลูกได้รับคำสั่งให้เรียกใช้เมธอดที่ถูก โอเวอร์ไรด์วัตถุนั้นจะทำงานตามเมธอดที่เขียนในคลาสลูก

  • ปลา ป = new ปลา();

    ป.นอน();


Inheritance
เรฟเฟอร์เรนซ์ของคลาสแม่สามารถอ้างถึงคลาสลูกได้เรฟเฟอร์เรนซ์ของคลาสแม่สามารถอ้างถึงคลาสลูกได้

  • ต้องการใช้งานวัตถุคลาสใด จะประกาศเรฟเฟอร์เรนซ์ของคลาสนั้น เช่น ถ้าต้องการใช้งานปลา

  • ปลา ป = new ปลา();

  • แต่ถ้าเป็นเรื่องการสืบทอด สามารถให้เรฟเฟอร์เรนซ์ของคลาสแม่อ้างถึงวัตถุในคลาสลูก

  • ตัวอย่างเช่น คลาสปลาสืบทอดคลาสสัตว์ ดังนั้น เรฟเฟอร์เรนซ์คลาสสัตว์อ้างถึงปลาได้

  • สัตว์ ส = new ปลา();


Inheritance
เรฟเฟอร์เรนซ์ของคลาสแม่สามารถอ้างถึงคลาสลูกได้เรฟเฟอร์เรนซ์ของคลาสแม่สามารถอ้างถึงคลาสลูกได้

  • สามารถสั่งให้วัตถุในคลาสลูก ทำงานได้โดยผ่านทาง เรฟเฟอร์เรนซ์ของคลาสแม่ได้

  • สัตว์ ส = new ปลา();

    ส.นอน():

  • ถ้าใช้เรฟเฟอร์เรนซ์คลาสแม่อ้างถึงวัตถุคลาสลูก จะเรียกใช้ได้เฉพาะเมธอดที่มีในคลาสแม่เท่านั้น ไม่เช่นนั้นคอมไพล์จะไม่ผ่าน

  • สัตว์ ส = new ลิง()ว

    ส.กิน();

    ส.เก็บลูกมะพร้าว();


Polymorphism

พอลิมอร์ฟิซึม เรฟเฟอร์เรนซ์ของคลาสแม่สามารถอ้างถึงคลาสลูกได้(Polymorphism)


Inheritance
พอลิมอร์ฟิซึม เรฟเฟอร์เรนซ์ของคลาสแม่สามารถอ้างถึงคลาสลูกได้

ส.นอน() สามารถตีความได้หลายแบบ ขึ้นอยู่กับวัตถุที่ ส อ้างถึง


Inheritance
ความหมายของโพลิมอร์ฟิซึมความหมายของโพลิมอร์ฟิซึม

  • poly แปลว่าหลายหรือมาก

  • morphism นั้นมาจากคำว่า morph ซึ่งแปลว่ารูปร่าง

  • รวมกันแล้วหมายถึงความสามารถที่สิ่งหนึ่งจะมีได้หลายรูปร่าง ซึ่งเมื่อใช้คำนี้กับการโปรแกรมเชิงวัตถุ ก็จะหมายถึงการที่คำสั่งแบบเดียวกันสามารถถูกแปลได้หลายแบบ


Inheritance
พอลิมอร์ฟิซึมกับการนำกลับมาใช้ใหม่

  • พอลิมอร์ฟิซึมสนับสนุน การนำกลับมาใช้ใหม่(reuse)

  • ถ้าเราได้เขียนโปรแกรมที่ใช้งานได้กับสัตว์ โปรแกรมของเราย่อมใช้ได้กับแมว ปลา และลิงนอกจากนั้นถ้ามีคนสร้างคลาสอีกัวน่าขึ้นมาใหม่ โปรแกรมที่เราเขียนก็สามารถใช้ได้กับคลาสอีกัวน่าเช่นกัน



Inheritance
คลาสรูปร่างและคลาสที่สืบทอดคลาสรูปร่างและคลาสที่สืบทอด


Inheritance
คลาสรูปร่างคลาสรูปร่างและคลาสที่สืบทอด

  • รูปร่างเป็นรูปที่อยู่ในระนาบสองมิติ

  • มีพื้นที่

    • เมธอด getArea() ใช้คำนวณหาพื้นที่ของรูปร่าง

  • มีสี

    • public enum Color { Red, Green, Blue }

    • เมธอด getColor()


Inheritance
คลาสรูปร่างคลาสรูปร่างและคลาสที่สืบทอด

public enum Color{

Red, Green, Blue

}

public class Shape {

private Color color;

public Shape() {

color = Color.Red;

}

public double getArea() {

return 0;

}

public void setColor(Color c) {

color = c;

}

public Color getColor() {

return color;

}

}


Inheritance
ทดสอบคลาสรูปร่างคลาสรูปร่างและคลาสที่สืบทอด

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());

}

}


Inheritance
คอมไพล์และรันคลาสรูปร่างและคลาสที่สืบทอด


Inheritance
คลาสสี่เหลี่ยมผืนผ้าคลาสรูปร่างและคลาสที่สืบทอด

class Rectangle extends Shape{

private double width;

private double height;

public Rectangle(int w, int h){

width = w;

height = h;

}

public double getWidth(){

return width;

}

public double getHight(){

//ควรเติมอะไรตรงนี้

}

}


Inheritance
คลาสสี่เหลี่ยมผืนผ้าคลาสรูปร่างและคลาสที่สืบทอด

class Rectangle extends Shape{

public double getArea() {

return width * height;

}

}


Inheritance
คลาสสี่เหลี่ยมผืนผ้าคลาสรูปร่างและคลาสที่สืบทอด

class Rectangle extends Shape{

public String toString(){

String str = “Rectangle”;

str += “color = “ +getColor();

str += “width = “ +width;

str += “height = “ +height;

str += “area = “ +getArea();

return str;

}

}


Inheritance
ทดสอบคลาสสี่เหลี่ยมคลาสรูปร่างและคลาสที่สืบทอด

class TestShape1

{

public static void main(String[] args)

{

Rectangle r = new Rectangle(3,4);

System.out.println(r);

System.out.println(r.toString());

}

}


Object

คลาส คลาสรูปร่างและคลาสที่สืบทอดObject


Tostring
เมธอด คลาสรูปร่างและคลาสที่สืบทอด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;

}

}


Tostring1
เมธอด คลาสรูปร่างและคลาสที่สืบทอดtoString()

  • เป็นเมธอดที่ถูกโอเวอร์ไรด์จากคลาส Object


Object1
คลาสคลาสรูปร่างและคลาสที่สืบทอด Object

  • แม่ของทุกคลาส

  • เมธอดที่น่าสนใจ

    • toString() //ส่งค่าสตริงต่าง ๆ ในวัตถุที่สนใจ

    • equals() //ใช้เปรียบเทียบวัตถุ

    • clone() //ใช้โคลนนิ่งวัตถุ ตัวโคลนจะมีลักษณะเหมือนกับตัวจริงทุกประการ

    • hashCode() // จะส่งจำนวนเต็มที่เป็นรหัสแฮส รหัสใช้สำหรับการค้นหาอย่างรวดเร็ว


Equals
เมธอด คลาสรูปร่างและคลาสที่สืบทอด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;

}


Hashcode
เมธอด คลาสรูปร่างและคลาสที่สืบทอดhashCode()

  • จะส่งจำนวนเต็มที่เป็นรหัสแฮช เพื่อการค้นหาข้อมูลที่รวดเร็ว

    public int hashCode() {

    return (int) (width + height * 17);

    }


Clone
เมธอด คลาสรูปร่างและคลาสที่สืบทอดclone()

สร้างวัตถุที่เหมือนกับวัตถุที่ได้รับข้อความ

public Object clone() {

Rectangle clone = new Rectangle(width, height);

return clone;

}


Object2
ทดสอบเมธอดที่โอเวอร์ไรด์จากคลาสทดสอบเมธอดที่โอเวอร์ไรด์จากคลาส 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));

}

}


Inheritance
สรุปเมธอดในคลาสสี่เหลี่ยมผืนผ้าสรุปเมธอดในคลาสสี่เหลี่ยมผืนผ้า


Inheritance
คลาสสี่เหลี่ยมจัตุรัสคลาสสี่เหลี่ยมจัตุรัส

Public class Rectangle extends Shape{

public Rectangle(double w, double h){

….

}

}

public class Square extends Rectangle {

public Square( double w) {

super(w,w);

}

...

}

เรียกใช้คอนสตรักเตอร์ในคลาส Rectangle


Super
Super();คลาสสี่เหลี่ยมจัตุรัส

  • super() หมายถึง การเรียกใช้คอนสตรักเตอร์ในคลาสแม่

  • จากตัวอย่าง super(w,w) คือการเรียกใช้

    Rectangle(double w, double h);

  • สาเหตุที่ใช้คำว่า super เพราะบางครั้งนิยมเรียกคลาสพื้นฐาน (คลาสแม่) ว่า super class และเรียกคลาสที่สืบทอด (คลาสลูก) ว่า subclass


Inheritance
คลาสสี่เหลี่ยมจัตุรัสคลาสสี่เหลี่ยมจัตุรัส

public class Square extends Rectangle {

public Square(double w){

super(w,w)

}

public String toString() {

String str = "Rectangle";

str += " color=" + getColor();

str += " width=" + getWidth();

str += " area=" + getArea();

return str;

}

}

เรียกจากคลาส Rectangle

เรียกจากคลาส Shape

เรียกจากคลาส Rectangle

เรียกจากคลาส Rectangle


Inheritance

การห้ามโอเวอร์ไรด์คลาสสี่เหลี่ยมจัตุรัส


Inheritance
การห้ามสืบทอดคลาสสี่เหลี่ยมจัตุรัส

  • ไม่สามารถถูกสืบทอดได้

    public final class Square

ไฟนอลคลาส

Public class SquareChild extends Square

คอมไพล์ไม่ผ่าน


Final class
final classคลาสสี่เหลี่ยมจัตุรัส

  • คลาสในแพ็จเกจ java.lang.*

    • Final class เช่น

      • String

      • StringBuffer

      • Math

      • System

      • Integer

      • Double


Inheritance
ไฟนอลเมธอดคลาสสี่เหลี่ยมจัตุรัส

  • ไม่สามารถถูกโอเวอร์ไรด์ได้

    publicclassShape {

    publicfinalColorgetColor() {

    returncolor;

    }

    ...

    }

    public class Rectangle extends Shape{

    public Color getColor(){

    return Color.Blue;

    }

    }


Protected

การเข้าใช้แบบ คลาสสี่เหลี่ยมจัตุรัสprotected


Protected1
การเข้าใช้แบบ คลาสสี่เหลี่ยมจัตุรัสprotected

  • คลาสลูกสามารถใช้เมธอดและแอททริบิวท์ที่มีการเข้าใช้แบบ protectedได้

  • คลาสที่อยู่ในแพ็คเกจเดียวกันก็สามารถใช้เมธอดและแอททริบิวท์ที่มีการเข้าใช้แบบ protected ได้

  • การเข้าใช้แบบนี้มีความเข้มงวดน้อยกว่าแบบprivate ซึ่งห้ามคลาสอื่นใดเข้าใช้ แต่ก็อิสระน้อยกว่าแบบpublic ที่ใครๆก็สามารถเข้าใช้ได้


Inheritance
คลาสวงกลมคลาสสี่เหลี่ยมจัตุรัส

public class Circle extends Shape {

protected double radius;

public Circle(double r) {

radius = r;

}

public double getRadius() {

return radius;

}

public double getArea(){

return Math.PI* radius * radius;

}

}


Inheritance
คำนวณพื้นที่ของวงแหวนคำนวณพื้นที่ของวงแหวน

public class Ring1 extends Circle {

public double getArea() {

double outerArea = Math.PI * radius * radius;

double innerArea = Math.PI * innerRadius * innerRadius;

return outerArea - innerArea;

}

...

}


Inheritance
คำนวณพื้นที่ของวงแหวนคำนวณพื้นที่ของวงแหวน

public class Ring2 extends Circle {

public double getArea() {

double outerArea = super.getArea();

double innerArea = Math.PI * innerRadius * innerRadius;

return outerArea - innerArea;

}

...

}


Abstract class

แอบสแตรกท์คลาส คำนวณพื้นที่ของวงแหวน(abstract class)


Abstract class1
คลาสที่ประกาศขึ้นมาลอยๆ (AbstractClass)

  • เมธอด getArea() ในคลาส Shape ไม่ควรส่งค่าศูนย์หรือค่าใดๆกลับมา ทั้งนี้เพราะว่าเราไม่ทราบวิธีคำนวณหาพื้นที่ของวัตถุ Shape

    public abstractdouble getArea();

  • เมธอดที่ถูกประกาศขึ้นมาลอยๆ (abstract) นี้ต้องอยู่ในคลาสที่เป็น abstract ด้วยเช่นกัน คลาส Shape เขียนใหม่ได้ดังนี้

    public abstract class Shape {

    public abstract double getArea();

    ...

    }


Abstract class2
การใช้งาน abstract class

  • ไม่สามารถสร้างวัตถุในคลาสนี้ได้

    Shape s = new Shape();

  • แต่อ้างถึงวัตถุในคลาสลูกได้

    Shape s;

    s = new Rectangle(3,2);

    s = new Square(5);


Inheritance
พอลิมอร์ฟิซึม

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());

}

}


Inheritance
การนำมาใช้อีก

public class ShapeArray {

public static double sumArea(Shape[] shapes) {

double sum = 0;

for( Shape s : shapes) {

sum += s.getArea();

}

return sum;

}

}


Inheritance
การนำมาใช้อีก

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);


Inheritance

ข้อดีข้อเสียของการสืบทอดข้อดีข้อเสียของการสืบทอด


Inheritance
ข้อดีของการสืบทอด ข้อดีข้อเสียของการสืบทอด

  • การนำกลับมาใช้ใหม่

    • ถ้าเราต้องการสร้างคลาสที่มีความสามารถคล้ายๆกับคลาสที่มีอยู่แล้ว

    • เราอาจจะใช้การสืบทอดแทนที่จะเขียนขึ้นมาใหม่หมด

  • ความเป็นมาตรฐานเดียวกัน

    • คลาสพื้นฐานเป็นการกำหนดโครงแบบในการระบุความสามารถของวัตถุในคลาสลูก

  • เข้าใจสาระสำคัญได้ง่าย


Inheritance
ข้อเสียของการสืบทอด ข้อดีข้อเสียของการสืบทอด

  • โปรแกรมทำงานช้าลง

    • มีค่าใช้จ่าย (overhead) ในค้นหาและเรียกใช้เมธอดของคลาสที่สืบทอด

    • แต่ค่าใช้จ่ายดังกล่าวถือว่าน้อยมากเมื่อเทียบกับประโยชน์ที่ได้รับจากการสืบทอด

  • โปรแกรมมีขนาดใหญ่ขึ้น

    • แต่หน่วยความจำราคาไม่แพง

  • ความซับซ้อนเพิ่มขึ้น

    • ผู้ใช้ต้องหาตามคลาสต่างๆ ที่อยู่ในผังการสืบทอดจนกว่าจะพบคลาสที่อิมพลีเมนต์เมธอดนั้น ปัญหาที่กล่าวถึงนี้มีชื่อว่าปัญหาลูกดิ่ง (Yo-yoproblem)

  • ออกแบบยาก

    • ต้องกำหนดต้องตัดสินใจ

    • แอตทริบิวต์ให้เป็น private หรือ protected


Inheritance

สรุปข้อดีข้อเสียของการสืบทอด


Inheritance
สรุปข้อดีข้อเสียของการสืบทอด

  • การสืบทอดในภาษาจาวาใช้แนวความคิดเดียวกับการถ่ายทอดคุณลักษณะจากพ่อและแม่

  • คลาสลูกสืบทอดความสามารถจากคลาสแม่

  • การทดสอบการสืบทอดทำได้โดยการแต่งประโยคที่มีคำว่าเป็น

  • การสืบทอดทำให้เกิดการนำไปใช้ใหม่ได้

  • คลาสลูกสามารถใช้เมธอดในคลาสแม่ได้ ถ้าเมธอดนั้นเป็น public หรือ protected


Inheritance
สรุปข้อดีข้อเสียของการสืบทอด

  • เมธอดที่ใช้กับคลาสแม่ได้ ก็สามารถใช้กับคลาสลูกได้

  • คลาสลูกสามารถโอเวอร์ไรด์เมธอดในคลาสแม่ได้

  • พอลิมอร์ฟิซึมคือการที่คำสั่งเดียวกันสามารถทำให้เกิดการทำงานที่ต่างกันขึ้นกับชนิดของวัตถุ

  • แอ็บสแตร็กต์เมธอดคือเมธอดที่ไมได้ระบุวิธีการทำงาน

  • แอ็บสแตร็กต์เมธอดต้องอยู่ในแอ็บสแตร็กต์คลาส

  • แอ็บสแตร็กต์คลาสเป็นเหมือนกับโครงที่กำหนดให้คลาสลูกต้อง อิมพลีเมนต์แอ็บสแตร็กต์เมธอด