transporter-7Interface

ธีมาพร ทรัพย์มูล 640710528

Interface คืออะไร?

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

ถ้าหากเพื่อนๆอ่านมาถึงตรงนี้แล้วยังไม่เข้าใจคอนเซปต์อินเทอร์เฟซแล้วล่ะก็ เราจะมาลองยกตัวอย่างแบบที่เข้าใจง่ายๆกัน 😄 เช่น การเปรียบเทียบอินเทอร์เฟซกับแปลนบ้าน

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

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

แล้ว Interface แตกต่างจาก Abstarct Class อย่างไร?

อินเทอร์เฟซ มีหลักการที่คล้ายกับ abstract class คือ สร้างอินเทอร์เฟซขึ้นมาก็เพื่อกำหนดโครงสร้างของเมธอดที่จำเป็นในการใช้งานขึ้นมา แต่ยังไม่ได้กำหนดรายละเอียดการทำงานใดๆ ลงไปให้กับเมธอดนั้น (abstract method) ดั้งนั้น เมธอดในอินเทอร์เฟซจึงเป็นเมธอดที่ว่างเปล่า ซึ่งในภายหลังจึงมีการกำหนดรายละเอียดของเมธอดเหล่านั้นลงไป โดยถูกกำหนดโดยคลาสที่เรียกใช้อินเทอร์เฟซนั้นๆ ซึ่งความแตกต่างก็คือ

Interface
Abstract Class

ทุกเมธอดใน interface จะเป็น abstract method โดยอัตโนมัติ

เมธอดใน abstract class ไม่จำเป็นต้องเป็น abstract method

อินเทอร์เฟซเน้นไปที่การประกาศโครงสร้างของเมธอด ไม่มีการกำหนดการทำงานใดๆภายใน คลาสที่ implement ต้องเขียนโค้ดให้กับทุกเมธอดในอินเทอร์เฟซ

abstract class มีความยืดหยุ่นมากกว่า เพราะสามารถกำหนดโค้ดภายในบางเมธอดได้ และคลาสที่สืบทอดสามารถเลือกที่จะไม่เขียนใหม่สำหรับเมธอดที่มีรายละเอียดแล้ว

คลาสที่นำอินเทอร์เฟซไปใช้งานไม่จำเป็นต้องมีความสัมพันธ์กับอินเทอร์เฟซนั้น เช่น คลาสไม่ต้องสืบทอดจากอินเทอร์เฟซก่อน แค่ implement อินเทอร์เฟซก็สามารถใช้ได้

คลาสที่จะใช้งาน abstract method ของ abstract class จำเป็นต้องสืบทอดจาก abstract class นั้น และต้องเขียนเมธอดขึ้นมาใหม่ในคลาสที่สืบทอดเพื่อกำหนดรายละเอียดการทำงานของ abstract method

อินเทอร์เฟซรองรับการสืบทอดหลายชั้นได้อย่างเต็มที่ คลาสสามารถ implement หลายอินเทอร์เฟซได้พร้อมกันโดยใช้เครื่องหมายคอมมา " , "

abstract class ไม่รองรับการสืบทอดหลายชั้นแบบตรงๆ คลาสสามารถสืบทอดจาก abstract class ได้เพียงคลาสเดียวเท่านั้น

อินเทอร์เฟซใช้คีย์เวิร์ด interface ในการประกาศ และใช้คีย์เวิร์ด implements ในการนำไปใช้งานในคลาสอื่น

abstract class ใช้คีย์เวิร์ด abstract ในการประกาศ และใช้คีย์เวิร์ด extends เมื่อต้องการนำไปใช้งานในคลาสอื่น

อินเทอร์เฟซไม่สามารถมีตัวแปรได้ ยกเว้นจะเป็นคอนสแตนต์ เช่น final และ static ที่มีค่าคงที่

สามารถมีฟิลด์เป็นตัวแปรปกติได้ และสามารถกำหนดให้ตัวแปรนั้นถูกใช้ภายในคลาสที่สืบทอดได้

วิธีการสร้าง Interface

ในการสร้างอินเทอร์เฟซนั้นจะใช้คีย์เวิร์ด interface และตามด้วยชื่อของอินเทอร์เฟซที่ต้องการ โดยจะต้องมีเมธอดอย่างน้อย 1 ตัว และมีการกำหนดเป็นแบบ public หรือจะไม่ระบุก็ได้เช่นกัน เพราะเมธอดทั้งหมดที่ประกาศจะเป็นแบบ public อยู่แล้ว ซึ่งเมธอดที่อยู่ในอินเทอร์เฟซนั้นจะไม่มีการกำหนดค่าหรือการเขียนโค้ดใดๆในเมธอดนั้นเลย

Syntax ในการสร้างอินเทอร์เฟซ

ตัวอย่าง

จากตัวอย่าง เราได้สร้างอินเทอร์เฟซชื่อ iTelevision ซึ่งใช้คำสั่ง interface โดยภายในอินเทอร์เฟซมีการประกาศเมธอดทั้งหมดสามเมธอด ได้แก่ turnOn(), turnOff(), และ changeChannel() ซึ่งเมธอดเหล่านี้ไม่มีการกำหนดโค้ดการทำงาน และจะถูกนำไปใช้โดยคลาสที่ต้องการ Implement อินเทอร์เฟซนี้ โดยคลาสนั้นจะต้องกำหนดโค้ดการทำงานของเมธอดเหล่านี้ทั้งหมด เพื่อให้ตรงตามที่อินเทอร์เฟซกำหนด

การใช้งาน Interface

การใช้งานอินเทอร์เฟซนั้นจะใช้คีย์เวิร์ด implements ตามด้วยชื่ออินเทอร์เฟซที่ต้องการ และในคลาสจะต้องมีเมธอด ที่อยู่ในอินเทอร์เฟซที่เราเลือกใช้งาน และเมธอดที่อยู่ในคลาสจะต้องมีการเขียนโค้ดในเมธอดนั้นเสมอ

ตัวอย่าง

จากตัวอย่าง จะเป็นการสร้างคลาสในการ Implement อินเทอร์เฟซ โดยใช้คำสั่ง implements หลังชื่อคลาส และตามด้วยชื่อของอินเทอร์เฟซ iTelevision ซึ่งภายในคลาส Television มีการกำหนดการทำงานในทุกเมธอดของอินเทอร์เฟซ iTelevision

การทำ Implement ในหลาย Interfaces

ในการสร้างคลาสนั้นเป็นไปได้ที่อาจจะต้องมีการทำ Implement ในการใช้งานหลายอินเทอร์เฟซ (Implementing multiple-interfaces) ในคลาสเดียวกัน เพื่อแก้ปัญหาการสืบทอดหลายชั้น (Multiple Inheritance) โดยคลาสนั้นจะต้อง implement เมธอดทั้งหมดที่กำหนดในแต่ละอินเทอร์เฟซที่เกี่ยวข้อง และในแต่ละอินเทอร์เฟซจะกำหนดกลุ่มของฟังก์ชันที่แตกต่างกันออกไป ซึ่งคลาสที่ implement จะต้องทำการเขียนโค้ดการทำงานของเมธอดเหล่านั้นทั้งหมด และคลาสสามารถสืบทอดอินเทอร์เฟซได้มากกว่าหนึ่งตัวโดยใช้เครื่องหมายคอมมา " , "

ตัวอย่าง

จากตัวอย่าง จะเป็นโปรแกรมที่มีการใช้งานหลายอินเทอร์เฟซ โดยมีการสร้างอินเทอร์เฟซ iVolume เพิ่มเข้ามาจากเดิม ที่มีเพียงแค่อินเทอร์เฟซ iTelevision โดยอินเทอร์เฟซ iVolume ได้กำหนดเมธอดเกี่ยวกับการควบคุมระดับเสียง และในคลาส Television ที่มีการกำหนดการทำงานให้กับเมธอดทั้งหมดจากอินเทอร์เฟซทั้งสอง ซึ่งภายในคลาสก็จะมีตัวแปรและเมธอดของมันเองได้ตามปกติ

การขยายอินเทอร์เฟซ (Extendable Interfaces)

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

ตัวอย่าง

จากตัวอย่าง อินเทอร์เฟซแรก iTelevision มีเมธอดพื้นฐาน เช่น turnOn() และ turnOff() อินเทอร์เฟซที่สอง iSmartTelevison สืบทอดจาก iTelevision ทำให้สามารถใช้งานเมธอดจากอินเทอร์เฟซแรกได้ และยังเพิ่มเมธอดใหม่ เช่น browseInternet() และ streamVideo() ซึ่งคลาส SmartTelevison นำอินเทอร์เฟซ iSmartTelevison ไปใช้ จึงจำเป็นต้องกำหนดการทำงานให้กับทุกเมธอดที่ถูกประกาศไว้ในทั้งสองอินเทอร์เฟซ

Interfaces กับ constants

ในอินเทอร์เฟซ นอกจากจะมีเมธอดแบบ abstract ยังสามารถมีคอนสแตนต์ได้ด้วย โดยคอนสแตนต์ในอินเทอร์เฟซจะเป็น public, static, และ final โดยอัตโนมัติ ซึ่งค่าของคอนสแตนต์นั้นจะไม่สามารถเปลี่ยนแปลงได้ และสามารถเรียกใช้งานได้โดยตรงผ่านชื่ออินเทอร์เฟซ ไม่ต้องมีการสร้างออบเจ็กต์ของคลาสที่นำอินเทอร์เฟซนั้นมาใช้งาน

จากตัวอย่าง คอนสแตนต์ MAX_VOLUME, MIN_VOLUME ในอินเทอร์เฟซจะเป็น public, static, และ final โดยอัตโนมัติ ซึ่งคอนสแตนต์เหล่านี้จะไม่สามารถเปลี่ยนแปลงค่าได้หลังจากกำหนดครั้งแรก และสามารถเรียกใช้คอนสแตนต์ในอินเทอร์เฟซได้โดยตรง ผ่านชื่ออินเทอร์เฟซ iTelevision โดยไม่จำเป็นต้องสร้างออบเจ็กต์ของคลาสที่นำอินเทอร์เฟซไปใช้ เนื่องจากคอนสแตนต์ในอินเทอร์เฟซเป็น final คลาสที่นำอินเทอร์เฟซไปใช้งานจะไม่สามารถกำหนดค่าของคอนสแตนต์ใหม่ได้

Reference

เนื้อหาในส่วนของความหมายของ interface, และการทำ Implement ในหลายๆอินเทอร์เฟซ
เนื้อหาในส่วนของความแตกต่างระหว่าง interface กับ abstract class
เนื้อหาในส่วนของความหมายของ interface, การใช้งาน interface, การทำ Implement ในหลายๆอินเทอร์เฟซ
เนื้อหาเพิ่มเติมในภาษา Java เรื่อง Constant
เนื้อหาเพิ่มเติมในภาษา C เรื่อง Interface
เนื้อหาเพิ่มเติมในภาษา C เรื่อง struct
เนื้อหาเพิ่มเติมในภาษา Python, Java เรื่อง Interface
เนื้อหาเพิ่มเติมในภาษา Python เรื่อง Interface
เนื้อหาเพิ่มเติมในภาษา Python เรื่อง การทำ Implement ในหลายๆอินเทอร์เฟซ

Slide

สไลด์ประกอบในการนำเสนอคลิปวิดีโอ

Last updated