Screen Shot 2558-02-03 at 3.58.43 PM
มีคนเขียนใน 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 :: ฟังชื่อมันดูน่ากลัวมากนะ แต่ว่ามันคืออะไร อธิบายหน่อยสิ
ดูรูปล่ะกันนะ
440px-Diamond_inheritance.svg

ถ้าเขียน 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 ล่ะ ?
Tags: