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

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

การเขียนโปรแกรมภาษาจาวาตอนที่ ๓. อ. รัชดาพร คณาวงษ์ 2 ความรู้เรื่องคลาสและวัตถุ เมื่อเราได้สร้างคลาสขึ้นมา สิ่งที่เราจะประกาศได้ จากคลาสคือ ตัวแปรอ้างอิง.

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


งานนำเสนอเรื่อง: "การเขียนโปรแกรมภาษาจาวาตอนที่ ๓. อ. รัชดาพร คณาวงษ์ 2 ความรู้เรื่องคลาสและวัตถุ เมื่อเราได้สร้างคลาสขึ้นมา สิ่งที่เราจะประกาศได้ จากคลาสคือ ตัวแปรอ้างอิง."— ใบสำเนางานนำเสนอ:

1 การเขียนโปรแกรมภาษาจาวาตอนที่ ๓

2 อ. รัชดาพร คณาวงษ์ 2 ความรู้เรื่องคลาสและวัตถุ เมื่อเราได้สร้างคลาสขึ้นมา สิ่งที่เราจะประกาศได้ จากคลาสคือ ตัวแปรอ้างอิง (reference) และ วัตถุ (instance) data method data reference instance

3 อ. รัชดาพร คณาวงษ์ 3 ตัวอย่างซูเปอร์คลาสและซับคลาส สมมุติว่าเรามีคลาสเริ่มต้นเป็น คลาสชื่อ Shape บอกลักษณะของรูปเรขาคณิตของวัตถุ 2 มิติ มีคลาส Square บอกลักษณะของสี่เหลี่ยม และ คลาส Triangle บอกลักษณะของสามเหลี่ยม ที่สืบ ทอดลักษณะมาจากคลาส Shape

4 อ. รัชดาพร คณาวงษ์ 4 inheritance & overriding class Figure { double width, height; String name; Figure(double w, double h, String n) { width = w; height = h; name = n; } public String getName() { return name;} public double getArea() { return 0.0;} public void setWidth(double w) { width = w; } public void setHeight(double h) { height = h;} }

5 อ. รัชดาพร คณาวงษ์ 5 inheritance & overriding class Rectangle extends Figure { Rectangle(double w, double h) { super(w,h,”rectangle”); } double getArea() { return width*height;} } class Triangle extends Figure { Triangle(double w, double h) { super(w,h,”triangle”); } double getArea() { return 0.5*widht*height;} }

6 อ. รัชดาพร คณาวงษ์ 6 Polymorphism class PolyEx { static void compute(Figure x) { System.out.println(x.getName()+” is”); System.out.println(x.getArea()); } public static void main(String args[]){ compute(new Figure(1, 1, “undefined”); compute(new Triangle(1, 1)); compute(new Rectangle(1, 1)); }

7 อ. รัชดาพร คณาวงษ์ 7 Polymorphism class A { void print() { System.out.println(“Im A”); } } class B1 extends A { void print() { System.out.println(“Im B1”);} } class B2 extends A { void print() { System.out.println(“Im B2”);} } class Other { void call(A a) { a.print(); } public static void main(String args[]){ call(new A()); call(new B1()); call(new B2()); }

8 อ. รัชดาพร คณาวงษ์ 8 Polymorphism print(A)print(B1)print(B2) class Aclass B1class B2 Call(A)

9 อ. รัชดาพร คณาวงษ์ 9 Astract Classes จะเห็นว่า คลาส Figure เป็นคลาสแม่ ซึ่งไม่ค่อยจะ มีรายละเอียดที่แน่นอนเท่าใด อย่างเช่น method getArea ที่คืนค่า 0 เพราะไม่สามารถบอกได้นั่นเอง ดังนั้น เราจึงไม่ควรจะสร้าง instance ใด ๆ จาก คลาส Figure Class ที่ไม่เห็นรูปลักษณ์ที่ชัดเจน เช่นนี้ เรา สามารถสร้างให้เป็นแม่แบบไว้ก่อนโดยไม่ระบุตัว โปรแกรมได้ ด้วยกลไก Astract Classes

10 อ. รัชดาพร คณาวงษ์ 10 Astract Classes ใช้ keyword “abstract” ไว้หน้า class และ method member ของคลาสนั้น Method member ที่มีคำว่า abstract ไม่ต้องมีตัว โปรแกรม Class ใด ๆ ที่มี abstract method อย่างน้อย หนึ่ง ต้องเป็น abstract class เสมอ Abstract Class ไม่สามารถนำไปสร้าง instance ได้ แต่สร้าง reference ได้

11 อ. รัชดาพร คณาวงษ์ 11 Astract Classes ตัวอย่าง abstract class abstract class One { void printName() { System.out.println(“One”); } abstract void greet(); } abstract class Two { void printName() { System.out.println(“Two”); } }

12 อ. รัชดาพร คณาวงษ์ 12 Astract Classes ตัวอย่าง การสร้าง class จาก abstract class class SubOne extends One { void greet() { System.out.println(“Hello”); } } class SubTwo extends Two { } class Abstract2 { static public void main(String args[]) { // new One(); // new Two(); (new SubOne()).greet(); (new SubTwo()).printName(); }

13 อ. รัชดาพร คณาวงษ์ 13 Astract Classes ตัวอย่างการ implement abstract methods ไม่ ครบ abstract class One { abstract void greet1(); abstract void greet2(); } abstract class Two extends One { void greet1() { System.out.println(“Hello”); } } class Three extends Two { void greet2() { System.out.println(“Hi”); } }

14 อ. รัชดาพร คณาวงษ์ 14 Astract Classes abstract class One { abstract void greet1(); abstract void greet2(); } abstract class Two extends One { void greet1() { System.out.println(“Hello”); } } class Three extends Two { void greet2() { System.out.println(“Hi”); } } class Abstract3 { static public void main(String args[]) { // new Two(); Three t = new Three(); t.greet1(); t.greet2(); }

15 อ. รัชดาพร คณาวงษ์ 15 Interfaces คือ abstract classes ที่มีสมาชิก –Data member เป็น ค่าคงที่ –Method member เป็น abstract

16 อ. รัชดาพร คณาวงษ์ 16 Interfaces ใช้คำว่า “interface” แทน “class” ทุก method ต้องเป็น abstract method และ public ทุก data members ต้องเป็น static และ final interface Greeting { static final public String s = “Hello”; abstract void greet(); }

17 อ. รัชดาพร คณาวงษ์ 17 Interfaces เนื่องจาก interface มีได้เพียง abstract method หรือค่าคงที่เท่านั้น ดังนั้นเราจะสร้างคลาสจาก interface ได้โดยใช้คำว่า interface แทนคำว่า extends ส่วนคำว่า extends จะส่งให้ interface เท่านั้น class extends class interface extends implements

18 อ. รัชดาพร คณาวงษ์ 18 Interface ตัวอย่างการสร้างคลาสจาก interface interface Greeting { static final String s = “Hello”; abstract void greet(); } class Hello implements Greeting { public void greet() { System.out.println(s); } } class Interface1 { public static void main(String args[]) { new Hello().greet(); }

19 อ. รัชดาพร คณาวงษ์ 19 Interface ตัวอย่างการสร้างคลาสจาก interface class Hi implements Greeting { public void greet() { System.out.println(s); } void moreGreet() {System.out.println(“How r u?”);} } class Interface2 { static void test(Greeting g) { g.greet();} public static void main(String args[]) { test(new Hello()); test(new Hi()); }

20 อ. รัชดาพร คณาวงษ์ 20 Note:Interface Note: เราไม่สามารถสร้าง instance ของ interface ดังนั้น data members ต้องมีค่าเริ่มต้น และ ไม่มี constructor อย่างเด็ดขาด

21 อ. รัชดาพร คณาวงษ์ 21 Multiple Inheritance ในภาษา C++ ยอมให้มีการกำหนดคลาสที่สืบทอด จากคลาสแม่มากกว่า หนึ่งคลาส ซึ่ง เป็นกลไกที่มี ประโยชน์อย่างมาก และสร้างปัญหาอย่างมาก เช่นกัน ถ้าไม่ระมัดระวังในการใช้งาน ซึ่งเป็นเหตุให้ Java ไม่ยอมให้มีการทำ multiple inheritance

22 อ. รัชดาพร คณาวงษ์ 22 Multiple Inheritance:Problem คลาส One และ คลาส Two มี int a เป็นสมาชิกทั้ง คู่ และ คลาส Three สืบทอดจาก คลาส One และ Two ดังนั้นคำสั่ง cout << a ใน constructor ของ คลาส Three จะเป็น a ที่สืบทอดจากคลาส One หรือคลาส Two ? #include class One { public: int a = 1; } class Two { public: int a = 2;} class Three : public One, public Two { public: Three() { cout<

23 อ. รัชดาพร คณาวงษ์ 23 Multiple Inheritance:Problem-Fix ปัญหาข้างต้นสามารถแก้ไขได้โดยวิธีใส่ Qualified เข้าไป ระบุว่ามาจากคลาส One หรือคลาส Two #include class One { public: int a = 1; } class Two { public: int a = 2;} class Three : public One, public Two { public: Three() { cout<< One.a; } }

24 อ. รัชดาพร คณาวงษ์ 24 Multiple Inheritance:Problem คลาส Zero มี int a เป็นสมาชิก แล้ว คลาส One และ คลาส Two สืบทอดมาจากคลาส Zero แต่ กำหนดค่าให้ a ไม่เท่ากัน ดังนั้น ค่า a ควรจะมีค่า เป็นเท่าใด ? #include Class Zero { public: int a;} class One:public Zero { public: One() { a = 1; } class Two:public Zero { public: Two() { a = 2;} class Three : public One, public Two { public: Three() { cout << a; } }

25 อ. รัชดาพร คณาวงษ์ 25 Multiple Inheritance:Problem-Fix จากตัวอย่างปัญหาข้างต้น Qualified ไม่ช่วย แก้ปัญหาซะแล้วเพราะค่า a จะเป็นเท่าใด ขึ้นกับ การสืบทอด ภาษา C++ ก็พยายามแก้ไขปัญหานี้อีกโดยใช้ dynamic inheritance ขึ้น คือเพิ่ม keyword “virtual” เพื่อขยายในตอนรันโปรแกรม และเป็น ตามลำดับดังนี้ class Three : public virtual One, public virtual Two {... }

26 อ. รัชดาพร คณาวงษ์ 26 Multiple Inheritance:Problem การแก้ปัญหาข้างต้น ทำได้แต่เพียงการมองเห็น data member เท่านั้น ซึ่งไม่อาจแก้ปัญหาการ polymorphism method ได้

27 อ. รัชดาพร คณาวงษ์ 27 Multiple Inheritance:Problem #include class One { public: virtual void print() { cout << “One”; } }; class Two { public: virtual void print() { cout << “Two”; } }; class Three : public One, public Two {}; void test (Three x) { x.print(); } void main() { Three t; Test(t); }

28 อ. รัชดาพร คณาวงษ์ 28 Multiple Inheritance&Interface จาวาจึงไม่ยอมให้ทำ multiple inheritance แต่ อย่างไรก็ตาม multiple inheritance มีประโยชน์ อย่างมาก ดังนั้น จาวาจึงใช้ interface เข้ามาช่วย แก้ปัญหานี้ ภาษาจาวายอมให้ extends ได้จากคลาสเดียว แต่ ยอมให้ implements จาก interfaces ได้ไม่จำกัด

29 อ. รัชดาพร คณาวงษ์ 29 Multiple Inheritance&Interface interface Greeting { abstract void greet(); } interface Farewell { abstract void bye(); } class MyClass implements Greeting, Farewell { public void greet() { System.out.println(“Hello”);} public void bye() { System.out.println(“Goodbye”);} } class MulInterface { static void test1(Greeting g) { g.greet();} static void test2(Farewell f) { f.bye();} public static void main(String args[]) { MyClass s = new MyClass(); test1(s); test2(s); }

30 อ. รัชดาพร คณาวงษ์ 30 Multiple Inheritance&Interface class Greeting{void greet() {System.out.println(“Hello”);}} interface Farewell { abstract void bye();} class MyClass extends Greeting implements Farewell { public void bye() { System.out.println(“Goodbye”);} } class MulInterface { static void test1(Greeting g) { g.greet();} static void test2(Farewell f) { f.bye();} public static void main(String args[]) { MyClass s = new MyClass(); test1(s); test2(s); }

31 อ. รัชดาพร คณาวงษ์ 31 Partially implementation interface Greeting{ abstract void thai(); abstract void english(); } abstract class NotYetGreet implements Greeting { public void thai() { System.out.println(“Ohiyo”);} } class Greet extends NoYetGreet { public void english() {System.out.println(“Good morning”);} } class PartInterface { public static void main(String args[]) { Greet g = new Greet(); g.thai(); g.english(); }

32 อ. รัชดาพร คณาวงษ์ 32 Interface extending interface Greeting { abstract void hi();} interface MoreGreeting extends Greeting { abstract void hello();} class Greet implements MoreGreeting { public void hi() {System.out.print(“Hi”);} public void hello() {System.out.print(“Hello”);} } class extInterface { public static void main(String args[]) { Greet g = new Greet(); g.hi(); g.hello(); }

33 อ. รัชดาพร คณาวงษ์ 33 Interface without abstract method interface MyConstants { int YES = 1; double PI = ; String GREET = “Hello”; } class ConsInterface implements MyConstants { public static void main(String args[]){ System.out.println(YES); System.out.println(PI); System.out.println(GREET); }

34 อ. รัชดาพร คณาวงษ์ 34 ทดสอบ interface A { int x = 1; } interface B { int x = 2; } class Test1Interface implements A, B{ public static void main(String args[]){ // System.out.println(x); System.out.println(A.x); System.out.println(B.x); } interface A { public void f(); } interface B { public void f(); } class Test2Interface implements A, B{ public void f() { System.out.println(“f”); } public static void main(String args[]){ new Test2().f(); }

35 อ. รัชดาพร คณาวงษ์ 35 ทดสอบ interface A { int x = 1; } interface B extends A { int x = 2; } class Test3Interface implements A, B{ public static void main(String args[]){ System.out.println(x); } interface A { public void f(); } interface B extends A { public void f(); } class Test4Interface implements A, B{ public void f() { System.out.println(“f”); } public static void main(String args[]){ new Test().f(); }

36 อ. รัชดาพร คณาวงษ์ 36 ตัวอย่าง สมมุติว่าเราเป็นผู้ผลิตซอฟต์แวร์ตัวหนึ่งชื่อ MyApplication ซึ่งต้องมีการติดตั้งโปรแกรม driver ของเครื่องพิมพ์ได้ด้วย โดยใช้ setPrinter() ดังนั้น เราจึงให้ driver ของเครื่องพิมพ์ ชื่อคลาส printer class MyApplication { Printer p; void setPrinter(Printer p) { this.p = p;} void printOut() { p.print();} }

37 อ. รัชดาพร คณาวงษ์ 37 driver printer class เราสร้าง คลาส driver printer แบบ ธรรมดา class Printer { protected int c = 0; public int getCount() { return c; } public void print() { c++; System.out.println(“Printer”); }

38 อ. รัชดาพร คณาวงษ์ 38 Sub classes สมมติมีบริษัท X และ Y ผลิต printer ซึ่งจะนำ class printer driver ของเราไปขยายได้ดังนี้ class Xprinter extends Printer { public void print() { c++; System.out.println(“X Printer”); } class Yprinter extends Printer { public void print() { c++; System.out.println(“Y Printer”); }

39 อ. รัชดาพร คณาวงษ์ 39 Polymophism ซึ่งเราก็สามารถเอา driver มาติดตั้งในโปรแกรม ของเราได้โดยเขียนดังนี้ class MyApplicationTest { public static void main(String args[]) { MyApplication a = new MyApplication(); a.setPrinter(new Xprinter()); a.printOut(); }

40 อ. รัชดาพร คณาวงษ์ 40 driver printer abstract class หากไม่ใช่ผู้ผลิตเครื่องพิมพ์ การเขียน print() ไม่ สามารถทำได้ เพราะไม่ทราบรายละเอียด ดังนั้นการ ทำเป็น abstract class น่าจะเป็นทางเลือกที่ดีกว่า abstract class Printer { protected int c = 0; public int getCount() { return c; } abstract public void print() }

41 อ. รัชดาพร คณาวงษ์ 41 driver printer Interface การเปิดเผยตัวโปรแกรม อาจจะไม่ใช่สิ่งที่ดีนัก ในทางธุรกิจ ดังนั้น ถ้าเราจะเพียงแต่ให้ specification design น่าจะดีกว่า interface Printer { int getCount() void print() }

42 อ. รัชดาพร คณาวงษ์ 42 driver printer Interface ทางบริษัทผู้ผลิตเครื่องพิมพ์ ก็สามารถสร้าง คลาส ที่ขยายได้ดังนี้ class Xprinter implements Printer { private int c = 0; public int getCount() {return c;} public void print() { c++; System.out.println(“X Printer”); } class Xprinter implements Printer { private int lc = 0; public int getCount() {return (int)lc;} public void print() { c++; System.out.println(“Y Printer”); }


ดาวน์โหลด ppt การเขียนโปรแกรมภาษาจาวาตอนที่ ๓. อ. รัชดาพร คณาวงษ์ 2 ความรู้เรื่องคลาสและวัตถุ เมื่อเราได้สร้างคลาสขึ้นมา สิ่งที่เราจะประกาศได้ จากคลาสคือ ตัวแปรอ้างอิง.

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


Ads by Google