มีคนเขียนใน comment ถามมาว่า
ช่วยอธิบายความแตกต่างระหว่าง Interface กับ Abstract class ให้หน่อย
ดังนั้นจึงทำการสรุปความแตกต่างของทั้งสองออกมาดังนี้
โดยข้อมูลนั้นผมนำมาจากบทความเรื่อง ‘Interface’ Considered Harmful
ซึ่งคุณ Uncle Bob อธิบายได้เห็นภาพ และ เข้าใจได้ง่ายมากๆ
ด้วยลักษณะของการถามตอบ มีรายละเอียดดังนี้
Q :: Interface ที่พูดมาหมายถึงอะไร หมายถึง interface ในภาษา Java, C# ใช่หรือเปล่า ?
ใช่แล้วนะ
Q :: Interface มันคือ feature ที่ภาษาดีๆ เขามีกันใช่ไหม ?
ใช่แล้วนะ
จริงอ่ะ !
Q :: แล้ว interface มันคืออะไร มันใช่ class หรือเปล่า ?
ไม่ใช่นะ interface มันต่างจาก class มากๆเลยนะ
Q :: มันต่างกันยังไงล่ะ ?
method ต่างๆ ใน interface มันไม่มีส่วนของ implementation เลยนะ
Q :: มีตัวอย่างไหมล่ะ ?
มีสิ ดังนี้
interface MyDAO { void delete(); }
Q :: แล้วแบบนี้เรียกว่า interface หรือเปล่า ? เพราะว่า method ก็ไม่มีส่วนของการ implement นะ
abstract class MyInterface { abstract void f(); }
ไม่ใช่ interface นะ แต่มันคือ abstract class
Q :: งั้น interface กับ abstract class มันแตกต่างกันอย่างไรล่ะ ?
abstract class มันจะมี method ที่มีส่วนการ implement ได้ด้วยนะ
ตัวอย่างเช่น
abstract class MyInterface { abstract void f(); void z() { doSomething(); } }
Q :: แล้วมีอะไรที่แตกต่างกันอีกหรือเปล่า ?
Abstract class มันสามารถมีตัวแปร non-static ได้นะ แต่ interface ไม่สามารถประกาศได้
Q :: แล้วมีอะไรที่แตกต่างกันอีกหรือเปล่า ?
class มันสามารถ extends จาก class อื่นได้เพียง class เดียวเท่านั้น
แต่ไม่สามารถ implements ได้
Q :: แล้วทำไม class ไม่สามารถ extends ได้มากกว่า 1 class ล่ะ ?
เพราะว่า Java ไม่อนุญาตให้ทำ Multiple inheritance ไงล่ะ
Q :: ทำไมไม่อนุญาตล่ะ ?
เพราะว่า compiler ไม่อนุญาตไงล่ะ
เพราะว่า multiple inheritance มันอันตรายมากๆนะ
Q :: อันตรายยังไงอ่ะ งงนะ ?
เคยได้ยินคำว่า Deadly Diamond of Death ไหมล่ะ
ไม่เคยนะ
Q :: ฟังชื่อมันดูน่ากลัวมากนะ แต่ว่ามันคืออะไร อธิบายหน่อยสิ
ดูรูปล่ะกันนะ
ถ้าเขียน code จะได้ประมาณนี้
class A {} class B extends A {} class C extends A {} class D extends B, C
ดูสิ code มันดูแย่ไหม ?
ดูสิ code มันงงไหม ?
ดูสิ code มันกำกวมไหม ?
Q :: ชักออกนอกเรื่องไปเยอะล่ะ มาต่อว่าทำไม class MyInterface จึงไม่ใช่ interface ล่ะ ?
เพราะว่า ถ้าเราใช้ keyword class แล้ว จะไม่สามารถทำ multiple inhertitance ได้
แต่ถ้าต้องการสามารถทำผ่าน interface ได้อย่างเดียวนะ ซึ่งเรียกว่า multiple interface แทน
Q :: แล้วทำไม คนสร้างภาษาถึงทำแบบนี้ล่ะ ?
อันนี้ก็ไม่รู้เหมือนกันนะ แต่ถ้าให้เดาก็คิดว่า คนสร้างน่าจะขี้เกียจ
ไม่ต้องการจะเผชิญกับปัญหาต่างๆ ที่เกิดขึ้นมั้ง
ดังนั้น มาถึงตรงนี้น่าจะพอทำให้เห็นบ้างแล้วว่า
interface กับ abstract class ในภาษา Java ต่างกันอย่างไร
แต่คำถามต่อไปที่มักจะเกิดขึ้นก็คือ
- เมื่อไรเราจะใช้ interface ล่ะ ?
- เมื่อไรเราจะใช้ abstract class ล่ะ ?