10.1 การเขียนโปรแกรมเชิงวัตถุ 2 Object Oriented Programming (OOP)

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

การเขียนโปรแกรมเชิงวัตถุ 2

Object Oriented Programming (OOP)

ตัวแปรและเมท็อดที่เป็น static

คีย์เวิร์ด static เป็นคีย์เวิร์ดที่ใช้ประกาศหน้าตัวแปรและเมท็อด ความพิเศษของ static คือว่าโดยปกติเวลาจะสร้างอ็อปเจ็คต้องทำการ new อ็อปเจ็คขึ้นมา ตัวแปรอ็อปเจ็คก็จะอ้างอิงไปที่อ็อปเจ็คที่สร้างขึ้น แล้วก็เอาตัวแปรนี้ไปเรียกใช้ตัวแปร ใช้เมท็อด แต่ถ้าตัวแปรหรือเมท็อดนั้นเป็น static ก็จะทำให้สามารถใช้ตัวแปรหรือเมท็อดนั้นได้เลยโดยไม่ต้องสร้างอ็อปเจ็คมาเรียกใช้งาน

สำหรับตัวแปรที่เป็น static นั้น จะทำให้ตัวแปรนั้นเป็นตัวแปรของคลาสไม่ได้เป็นของอ็อปเจ็คใดอ็อปเจ็คหนึ่ง ถ้ามีการเปลี่ยนแปลงขึ้นกับตัวแปร static อ็อปเจ็คอื่นๆทั้งหมดจะมองเห็นการเปลี่ยนแปลง

วิธีประกาศ

สำหรับตัวแปร    modifier static ชนิดตัวแปร ชื่อตัวแปร;

สำหรับเมท็อด    modifier static ประเภทผลลัพธ์ ชื่อเมท็อด( ) { }

                        วิธีการเรียกใช้งานเมท็อดที่เป็น static ถ้าอยู่ในคลาสเดียวกันก็ ชื่อเมท็อด(); แบบนี้ได้เลย แต่ถ้าอยู่คนละคลาสก็ ใช่ ชื่อคลาส.ชื่อเมท็อด static

            เมท็อดที่เป็น static ที่ได้ใช้มาแล้วก็คือ เมท็อด main ใน public static void main(String [] args) เพราะว่า main เป็นเมท็อดสำหรับเริ่มทำงาน ดังนั้นต้องสามารถทำงานได้เลยโดยไม่ต้องมีอ็อปเจ็คมาเรียกใช้งาน

 

รูป 10-2-1

            เมท็อดชื่อ f ในบรรทัดที่ 17 ประกาศเป็น เมท็อด static ดังนั้นในบรรทัดที่ 12 สามารถเรียกใช้เมท็อด f ได้เลย แต่บรรทัดที่ 13 มีการเรียกใช้เมท็อด println ซึ่งอยู่ในคลาส System ก็ต้องใช้งานแบบ ชื่อคลาส.เมท็อด

 

รูป 10-2-2

            สังเกตว่าเมื่อเอาคำว่า static ออกในบรรทัดที่ 17 จะเกิด error ขึ้นทันทีที่บรรทัดที่ 12 ที่เรียกเมท็อด

ตัวแปร เมท็อดและคลาสที่เป็น final

            คล้ายกับ static คีย์เวิร์ด final ใช้ประกาศหน้าตัวแปร เมท็อดและยังประกาศหน้าคลาสได้ด้วย

–          ถ้า final ไปประกาศหน้าตัวแปร ตัวแปรนั้นจะมีค่านั้นตลอดเปลี่ยนแปลงไม่ได้ เรียกว่าเป็นค่าคงที่

–          ถ้าอยู่หน้าเมท็อดแล้วคลาสนี้ถูกสืบคุณสมบัติไป เมท็อดนี้จะไม่สามารถเขียนทับแก้ไขได้หรือก็คือไม่สามารถ Overriding ได้

–          แต่ถ้าอยู่คลาส คลาสนั้นๆจะไม่สามารถเป็นคลาสแม่ได้เลย คือบางทีไม่ต้องการให้คนเอาอะไรเปลี่ยนทั้งนั้นก็ประกาศคลาสเป็น final เพราะบางทีประกาศเมท็อดเป็น final คลาสลูกก็เขียนเมท็อดใหม่ขึ้นมาได้ เช่น เราไม่ต้องการเขาเปลี่ยนชื่อ เขาก็เขียนเมท็อดสำหรับเปลี่ยนชื่อใหม่ได้

วิธีประกาศ

สำหรับตัวแปร    final ชนิดตัวแปร ชื่อตัวแปร = ค่าคงที่ ;

สำหรับเมท็อด    modifier final ประเภทผลลัพธ์ ชื่อเมท็อด( ) { }

สำหรับคลาส      modifier final class ชื่อคลาส{ }

เมท็อดและคลาส abstract

            เป็นอีกหนึ่งคีย์เวิร์ดในจาวาที่ใช้สำหรับการประกาศหน้าคลาสหรือเมท็อดใดๆให้มีคุณสมบัติเป็น abstract(นามธรรม) ซึ่งหมายถึงคลาสที่ไม่สามารถมีอ็อปเจ็คได้ หรือถ้าประกาศหน้าเมท็อดก็จะเป็นเมท็อดที่ไม่ได้กำหนดการทำงานเอาไว้ ให้คลาสลูกที่มาสืบทอดคุณสมบัติไปไปกำหนดการทำงานเอาเอง

            ทำไมต้อง abstract – ก็เพราะว่าบางครั้งมีการสืบทอดคลาสแม่ลูก สมมติว่าคลาส A เป็นคลาสแม่ มีคลาสลูก B, C, D, E มาสืบคุณสมบัติไป ปรากฏว่าคลาส B, D และ E ต้องใช้เมท็อดชื่อ show() เหมือนกัน แต่ในคลาสแม่ A ไม่มีเมท็อดนี้อยู่ ก็ให้คลาสแม่ประกาศเมท็อดเปล่าเอาไว้ คลาสลูกจะได้ใช้งาน ซึ่งคลาสลูกก็สามารถเปลี่ยนแปลงการทำงานในเมท็อด abstract ได้

            เขียนเมท็อดชื่อ show() ใหม่ไม่ได้หรอ – ได้ ก็เขียนใหม่ในคลาส B, D ,E ได้ แต่มันไม่เป็นไปตามเรื่องการสืบทอดคุณสมบัติ(inheritance)และการพ้องรูป(polymorphism) ของการเขียนจาวาแบบ OOP ก็แบบว่า ตัวแปรอ็อปเจ็คของแม่สามารถอ้างอิงอ็อปเจ็คของลูกได้ แต่ถ้าในคลาสแม่ไม่มีเมท็อด show() แม่ก็จะเรียกใช้ก็งานเมท็อดนี้ไม่ได้ ซึ่งก็ทำให้ทำงานไม่ดี

            วิธีประกาศ

สำหรับคลาส      modifier abstract class ชื่อคลาส { }

สำหรับเมท็อด    modifier abstract ประเภทผลลัพธ์ ชื่อเมท็อด(พารามิเตอร์)

ตัวอย่างเช่น

public abstract class Name

{

public abstract void setName(String name);

}

แต่ว่า

1.      ภายในคลาสที่เป็น abstract จะใช้คำสั่ง new สร้างอ็อปเจ็คของคลาสนั้นไม่ได้ เช่น new Name(); ไม่ได้

2.      ภายในเมท็อดที่เป็น abstract จะมีคำสั่งไม่ได้

3.      ใน abstract คลาส จะมีเมท็อดที่เป็นหรือไม่เป็น abstract อยู่ก็ได้

4.      แต่ abstract เมท็อดต้องอยู่ใน abstractคลาส เท่านั้น

 

รูป 10-2-3

ถ้าเอาคำว่า abstract ในบรรทัดที่ 2 ออกจะ error เพราะ บรรทัดที่ 4 กับ 7 เป็น abstract เมท็อด

5.      Abstract คลาสสามารถสืบทอดคุณสมบัติกันได้เหมือนคลาสปกติ แต่คลาสที่สืบทอดไป(คลาสลูก)จะต้องอิมพลีเมนท์(implement)[1] ทุกเมท็อดแม้จะไม่ได้ใช้งานก็ตาม

6.      คลาสธรรมดาสืบทอดคุณสมบัติจากคลาส abstract ได้

7.      มีคอนสตรัคเตอร์

Interfaces

                เป็นเรื่องต่อมาจาก abstract เพราะ interface เป็นเหมือคลาสๆหนึ่งที่ เมท็อดทุกเมท็อดเป็น abstract และตัวแปรทุกตัวก็เป็นตัวแปรแบบ public static final ด้วย

            การประกาศ

การเขียนคลาสปกติ         public class Worker { }

เขียน interface              public interface Worker { } ก็เอาคำว่า interface ไปแทน class

            ใน eclipse เวลาจะสร้างคลาส ตรงใต้ class จะมีคำว่า interface ก็กดตรงนั้นเลย

 

รูป10-2-4

            การประการตัวแปรและเมท็อดของ interface ต้องเป็น ตัวแปร public static final และ เมท็อด abstract  อยู่แล้วก็ไม่ต้องเขียนแบบรูป 10-2-4 ก็ได้ เขียนแบบข้างล่างแทน

 

รูป 10-2-5

วิธีใช้

1.      ใช้คำว่า implements ตามด้วย ชื่อinterface เช่น public class A implements interface B { } แต่อิมพลีเมนต์ interface แล้วต้องทำการ interface ทุกเมท็อดของ interface นั้นด้วย ง่ายๆคือเวลาอิมพลีเมนต์มันขึ้นขีดเส้นสีแดง error ที่ชื่อคลาส A พอกดมันก็จะอิมพลีมเนต์ให้เลยแบบนี้

 

รูป 10-2-6

2.      ค่าคงที่ เป็น public static final หมายถึงเปลี่ยนแปลงไม่ได้

3.      อิมพลีเมนต์ได้มากกว่า 1 interface  เช่น class A implements Interface1, Interface2, Interface3 { }

4.      ใช้ extends ก่อนอิมพลีเมนต์ก็ได้  เช่น class A extends B implements Interface1, Interface2, Interface3 { }

 

Abstract กับ Interface

–          เมท็อดของ abstract เป็น abstract ก็ได้ไม่เป็นก็ได้ แต่ถ้า interface นี่ไม่ได้เลยต้อง abstract เท่านั้น

–          ตัวแปรของ interface ล็อกค่า ของ abstract ไม่ล็อกเปลี่ยนแปลงได้

–          เวลามีคลาสไหนจะใช้งานเมท็อดของ abstract ต้องสืบทอดคุณสมบัติเป็นแม่ลูกกัน แต่ interface ไม่ต้องอยากใช้งานก็เอาไปใช้

–          Interface ไม่มีคอนสตรัคเตอร์ abstract มี

ทำไมต้อง interface

            เนื่องจาก interface ไม่ต้องมีความสัมพันธ์แม่ลูกกันแวลาใช้งาน ขอเปรียบเทียบว่า สมมติมีคลาสหมู กับคลาสลูกหมู แน่นอนว่าแบบนี้ต้องเป็นคลาสแม่ลูกกันเพราะนอกจากต้องจะสืบทอดคุณสมบัติทั้งรูปร่าง สีผิวแล้ว พฤติกรรมหรือนิสัยยังต้องทำอะไรคล้ายๆกันด้วย แบบนี้ก็ใช้ abstract ได้ เพราะลูกหมูหลายตัวอาจจะมีพฤติกรรมบางอย่างที่ทำเฉพาะตัวไม่เหมือนกัน ในคลาสลูกหมูก็ไปแก้เมท็อดนั้นเอา เรื่องมีอยู่ว่าแม่หมูทำงานอย่างหนึ่งคือดมกลิ่นหาเห็ดในป่ากับเก็บเห็ด วันนึงแม่หมูไม่สบายเลยจะเอาคนมาทำงานแทน แน่นอนว่าลูกหมูก็ต้องทำได้อยู่แล้วเพราะ extends สกิลดมกลิ่นเห็ดมาจากแม่ แต่เนื่องจากลูกหมูเด็กไป แม่หมูเลยให้หมีป่ามาทำงานแทน แต่หมีป่าไม่ได้เป็นลูก เป็นญาติอะไรกับหมูเลยก็จะมีสกิลไม่เหมือนกัน แต่อยากให้หมีป่าหาเห็ดเก็บเห็ดได้ ก็ไปเขียน interface มาแล้วให้หมีอิมพลีเมนต์สกิลนี้ไป หมีป่าก็จะทำงานแทนแม่หมูได้

 

 


[1] ใส่คำสั่งอะไรก็ได้ลงไป ไม่ใส่ก็ต้องเขียนว่างไว้ก็ได้ คือใส่ { } หลังเมท็อดไว้เฉยๆ

 

แผนผังการเรียนเขียนโปรแกรม

 

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

 

ใส่ความเห็น