Inheritance การสืบทอดคลาส
การนำ Code กลับนำมาใช้ใหม่ การนำ Code กลับนำมาใช้ใหม่ คือ การใช้ Code ที่มีอยู่แล้วมาสร้างคลาสใหม่ซึ่งอาจจะเป็นการสืบทอดจากคลาสหลัก (Inheritance) ที่ได้นำมาเป็นส่วนประกอบคลาสใหม่ที่สร้าง การสืบทอดจะเป็นการนำ Code เดิมกลับมาใช้อีกครั้ง โดยที่เราไม่ต้องเขียนใหม่ ทำให้ประหยัดเวลาและถ้า Code นั้นได้มีการตรวจสอบข้อบกพร่องอย่างดีแล้วยิ่งทำให้ช่วยลดเวลาในการตรวจสอบ Code อีกครั้ง
การนำคลาสกลับมาใช้อาจจำแนกได้เป็น 4 วิธี คือ 1. นำโปรแกรมที่เขียนเก็บไว้มาใช้ 2. เขียนใหม่จากข้อมูลที่มีอยู่ 3. นำคลาสมาใช้ในลักษณะ Composition 4. นำคลาสกลับมาใช้ภายใต้การสืบทอดคุณสมบัติ (Inheritance)
การสืบทอดคุณสมบัติ (Inheritance) คือ การใช้คลาสที่มีอยู่แล้วมาสร้างเป็นคลาสใหม่ (คลาสย่อย) โดยการสืบทอด วิธีการนี้ เราสามารถใช้คุณสมบัติต่างๆของคลาสเดิม เช่น ตัวแปร เมธอด คอนสตักเตอร์ หรืออื่นๆ ทั้งหมดที่คลาสเดิมมีอยู่แล้วได้ โดยไม่ต้องมีการแก้ไขใดๆ รวมทั้งยังสามารถเพิ่มเติมคุณสมบัติใหม่ๆ ที่คลาสเดิมไม่มีได้อีกด้วย เราเรียกคลาสที่มีอยู่ว่าคลาสหลัก (Superclass) และคลาสใหม่ที่สืบทอดว่า คลาสสืบทอด หรือ คลาสลูก (Subclass)
การถ่ายทอดแบบลำดับชั้น (Hierarchical Class) - การสืบทอดไม่ได้จำกัดเพียงระหว่าง superclass และ subclass เท่านั้น sub class สามารถเป็น superclass ของ class อีกหนึ่งได้ การเขียนแผนภาพแสดงความสัมพันธ์ นิยมเขียนเป็นแผนผังแบบต้นไม้ (Tree)
แผนผังแบบต้นไม้ (Tree) Class สัตว์ Class สัตว์ปีก Class สัตว์เลื้อยคลาน Class สัตว์บก Class สัตว์น้ำ
การ Inheritance สามารถทำได้ 2 ลักษณะ คือ 1. Single Inheritance คือ การที่ subclass ได้รับการถ่ายทอดคุณสมบัติมาจาก Superclass เพียงคลาสเดียวClass A และ Class B Class A Class B
2. Multiple Inheritance คือการที่ subclass ได้รับการถ่ายทอดคุณสมบัติต่างๆ มาจาก Superclass มากกว่า 1 คลาส Class A Class B Class C
หลักในการสร้างการสืบทอด - สร้าง class หลักขึ้นมา 1 class แล้วกำหนดให้มีคุณสมบัติต่างๆ ซึ่งเป็นคุณสมบัติโดยรวม ที่ class อื่นๆ จำเป็นต้องมี - จากนั้นจึงสร้าง class คลาสอื่นขึ้นมา เพื่อรับการถ่ายทอดคุณสมบัติทั้งหมดจาก class หลักมาโดยอัตโนมัติ โดยไม่ต้องสร้างขึ้นใหม่ - สามารถสร้างคุณสมบัติอื่นๆ นอกเหนือจาก class หลักขึ้นมาเองได้
การสร้าง Superclass และ Subclass Superclass จะสร้างเหมือนกับการสร้าง Class ทั่วไป แต่การสร้าง Subclass จะระบุคำว่า “extends” ร่วมด้วยเพื่อให้ทราบว่า Subclass จะใช้คุณสมบัติจาก Superclass ชื่ออะไร รูปแบบดังนี้ subclass_name คือ ชื่อของคลาสใหม่หรือคลาสลูก superclass_name คือ ชื่อของคลาสที่สืบทอดหรือคลาสแม่ class subclass_name extends ชื่อ superclass_name
การสร้าง Superclass และ Subclass (ต่อ) class A { int x ; } class B extends A { int y ; } ทำการสร้าง instance จากคลาสทั้ง 2 A a = new A() ; B b= new B() ;
Example Superclass 1 A B class A{ void printA(){ System.out.println("A"); } class B extends A{ void printB() { System.out.println("B"); public class inheritance{ public static void main(String[] args) { A m = new A(); B n = new B(); m.printA(); n.printA(); n.printB(); } A B
Example Superclass 2 class A{ int x = 1; public class inheritance1{ } class B extends A{ int y = 3; class C extends B{ int z = 4; public class inheritance1{ public static void main(String[] args) { A o = new A(); System.out.println (0.x); B p = new B(); System.out.println (p.x+ “,”+p.y); C m = new C(); System.out.println (m.x+m.y+m.z); } 1 1,3 8
การเข้าถึงด้วย access modifier การป้องกันการเรียกใช้ภายใน Superclass การเข้าถึงด้วย access modifier public ระบุที่ method หรือ variable แสดงว่า class ใดๆ สามารถ access ได้ private ระบุที่ method หรือ variable สามารถใช้ access ได้เพียงใน class นั้นเท่านั้น subclass ไม่สามารถ access ได้ protected method หรือ variable สามารถ access เมื่อเป็นสมาชิกของ class หรือ subclass
การป้องกันการเรียกใช้ภายใน Superclass (ต่อ)
Example 1 class A{ protected int x = 10; private int w = 5; } class B extends A{ int y; void Mul() { y = x*w; System.out.println (y); public class Test{ public static void main(String[] args) { B m = new B(); m.Mul(); } Compile Error / private
การใช้ keyword super ใช้สำหรับการทำงานใน Subclass ซึ่งมีประโยชน์ 2 ประการ คือ 1. เพื่อเรียกใช้สมาชิกของ Subclass และ Superclass ที่ใช้ชื่อสมาชิกเดียวกัน รูปแบบ super.member เช่น super.x=x; super.r=r;
การใช้ super เรียกสมาชิกของ Superclass public class super1{ public static void main(String[] args) { B m = new B(5,8); m.show(); } class A{ int x; } class B extends A{ int x; B(int a,int b) { super.x = a; x = b; } void show(){ System.out.println("x in superclass : "+super.x); System.out.println("x in subclass : "+x); x in superclass : 5 x in subclass : 8
การใช้ keyword super (ต่อ) 2. Subclass สามารถเรียกใช้ Constructor Method ของ Superclass โดยไม่จำเป็นต้องสร้าง Constructor ของตนเองขึ้นมาใหม่ (Constructor จะไม่ถูกสืบทอดจากการ inherit ด้วย extends) รูปแบบ super(argument) เช่น super(r)
การใช้ super เรียก Constructorของ Superclass1 class A{ A(String s){System.out.println(s);} } class B extends A{ B() { super("Hello"); System.out.println("Good Boy"); public class super_constru{ public static void main(String[] args) { B m = new B(); Hello Good Boy
การใช้ super เรียก Constructorของ Superclass2 class A{ int a,b; A(int a, int b){ this.a = a; this.b = b; } class B extends A{ int c; B(int c) { super(0,0); this.c = c; public class super_constru2{ public static void main(String[] args) { B m = new B(5); System.out.println("a = "+m.a+ " b = " +m.b+ " c = "+m.c); } a=0 b=0 c=5
Inheritance Assessments Refer a difference variable from class C x this.x super.x ((B)this).x ((A)this).x super.super.x class A { int x; .. } class B extends A { class C extends B { x in class C x in class C x in class B x in class B Inheritance Assessments Define A class as super-class which has one element named “X”. B Class extends A Class and also defines an element named “X”. C Class extends B Class and also defines an element named “X”. We can refer to all hidden variable from Class C as following “x” means element “x” in C class “this.X” means element “x” in C class “super.x” means element “x” in B class “((B)this).x means element “x” in B class , Note : (B) refers to object casting from “C” class to “B” class “((A)this).x means element “x” in A class , Note : (A) refers to object casting from “C” class to “A” class “super.super.x” means “x” element in A class How this happen? x in class A x in class A
Inheritance Solutions B ((A)this).x B A [x] ((B)this).x Inheritance Solution Once we are instantiate an object from C class, An internal implementation of C class in memory space maintains the class hierarchy which a super-class inside a sub-class as above picture. A Class is inside B class and B class is inside C class. Therefore, we can do object casting easily. Object casting helps us to scope out the object which one we want to refer to. this.x C [x] [x] Class Diagram Memory Space
Shadowing ถ้าเรากำหนด data member ในคลาสลูกมีชื่อเหมือนกับ data member ในคลาสแม่ ชื่อของลูกจะบัง(shadow)ชื่อในคลาสแม่ class A {int x = 1;} class B extends A {float x = 2.0f;} class shadowing { public static void main(String args[]) { B b = new B(); A c = new A(); System.out.println(b.x); System.out.println(c.x); } 2.0 1
แบบฝึกหัด Point2D x,y : int Point2D(x:int,y:int) Point2D(x:int) z : int Point3D(x:int,y:int,z:int) Point3D(z:int) Point3D() Test2D3D Main():void
Class Point2D - Point2D(x:int,y:int) ใช้ set ค่า x y - Point2D(x:int) เรียก constructor Point2D(x:int,y:int) มาใช้ กำหนดค่า เป็น (x,0); - Point2D() เรียก constructor Point2D(x:int,y:int) มาใช้ กำหนดค่าเป็น (0,0)
Class Point3D - Extends จาก Point2D - Point3D(x:int,y:int,z:int) ใช้ set ค่า x y z (x,y เรียกใช้ constructor จาก Point2D (x:int,y:int) - Point3D(z:int) ใช้ set ค่า z และเรียก ใช้ constructor จาก Point2D(x:int,y:int) กำหนดค่า เป็น (0,0); - Point3D() เรียก constructor Point3D(x:int,y:int,z:int) มาใช้ กำหนดค่าเป็น (0,0,0)
ผล RUN x = 0 y = 0 x = 5 y = 0 x = 5 y = 10 x = 0 y = 0 z = 0