Interface vs Abstract Class [ver. สรุปสุด ๆ ละ]

Pattanan Numpong
Stand Up Code
Published in
2 min readMay 12, 2022

เพื่อนที่แทนกันได้บางเรื่อง ใช้ยังไงทำไมต้องใช้

สวัสดีเพื่อน ๆ เราเชื่ออาจจะมีบางคนยังสับสนว่า Interface ใช้เพื่ออะไรกันแน่

และ ทำไมต้องมี Abstract Class มี Interface ทั้ง ๆ ที่เขียนเพียว ๆ ก็ได้

คำตอบในแง่ของเขียนโปรแกรมให้เป็นระบบระเบียบ เพื่อการเป็นนักพัฒนาซอฟแวร์ แม้ว่าบางคนไม่คิดจะเป็น

เราต้องลด coupling แน๊ะ คำศัพท์เทคนิคอีกแล้วบางคนคิด

Coupling (n.) แปลว่า ข้อต่อ

อธิบายง่าย ๆ มัน คือ การที่โปรแกรมเราโยงไปโยงแบบเละเทะ คือ โปรแกรมใหญ่ ระดับ 2000 บรรทัดมีแน่ ๆ ยิ่งโค้ดใหญ่ Coupling ยิ่งมากตามไปด้วย

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

ตอบแบบหล่อ ๆ “ การปลูกฝั่งธรรมเนียมในการเขียนโค้ดที่ดีจะทำให้คุณเป็นนักพัฒนาซอฟแวร์ที่มีคุณภาพ และ ไม่เป็น ภาระ กับทีม”

เอาละ ๆ มาดูดีกว่าใช้ Interface ทำไมกัน

ตัวอย่างนี้ เป็นตัวอย่างที่ Basic มาก คือ

ทั้งนก และ เครื่องบิน ต่างก็บินได้เหมือนกัน แต่ต่างวิธีการ นกบินด้วยการกระพรือปีก เครื่องบินด้วยไอพ่น

ในการออกแบบที่ซับซ้อนเราอาจจะใช้ Interface มาเพื่อจัดกลุ่มของ method ก็ได้

เช่น เรากำหนดว่า ปลาเป็นทั้งเหยื่อ (Prey) และ ผู้ล่า (Predator)

Predator มี method ล่า(Hunt) เหยี่ยวล่า ปลาล่าปลาตัวเล็ก

Prey มี method คือ หนี(Flee) ว่ายน้ำหนีถ้าเป็นปลา วิ่งถ้าเป็นกระต่าย

แล้ว….มันดีอย่างไร มันให้เราอ่านโค้ดแล้วรู้ทันทีว่า ถ้าปลาเป็น Preditor มันสามารถทำอะไรได้บ้าง และ ถ้าเป็น Prey ทำอะไรได้บ้าง ในงานที่โค้ดหนัก ๆ เยอะ ๆ ก็ช่วยเบาแรงในการทำความเข้าใจอะนะ

แล้วมันต่างจาก Abstract Class ไหมนะ

ต่างจ้า… Abstract Class และ Interface แม้จะทำงานคล้าย ๆ กันแต่การใช้งานต่างกันครับผม

Abstract Class ชื่อ ก็บอกว่า Class มันจะทำงานที่เกี่ยวกับ Class เช่น เรามี Class Animal มี Method กิน เดิน วิ่ง นอน หรือ มี Instance Variable เช่น boolean isMamal แต่เราไม่อยากให้มีการสร้างคลาส Animal ได้เพื่อป้องกันการลัดขั้นตอนในโปรแกรมบางอย่าง

การจะใช้งาน “ต้อง inherit ออกไปเท่านั่น” และจะต้องประกาศ method ทุกอันแม้ว่าจะใช้หรือไม่ก็ตามครับ ใช้ extands

แต่ Interface ทำได้แค่กับ Method นะครับ เลยนิยมใช้กับการทำงานที่ใช้ในการกำหนดกลุ่มของพฤติกรรมมากกว่าครับ ตามตัวอย่างข้างต้น

สำหรับใครอยากลองรันดูตัวอย่าง ก็ตามนี้เลย

หวังว่าจะเป็นประโยชน์บ้างไม่มากก็น้อยครับ

--

--