เคยสงสัยกันไหมว่า Abstract Class กับ Interface นั้นแตกต่างกันอย่างไร ซึ่งรูปแบบการใช้งานนั้น พอมองผ่าน ๆ แล้วดูเหมือนกับว่า แทบไม่ต่างกันเลย เผลอ ๆ นำมาใช้งานแทนกันเลยด้วยซ้ำ ซึ่งในวันนี้ทางผู้เขียนจะมาอธิบายให้กับทุกคนได้ฟังกัน
ก่อนอื่นเลย เรามาทำความรู้จักกันคร่าว ๆ เกี่ยวกับ Abstract Class กับ Interface กันก่อนเลย โดยที่บทความนี้จะขอใช้ Java ในการอธิบายเนื้อหาบทความนี้นะครับ
มาเริ่มกันด้วย Interface ก่อนแล้วกัน
Interface คือ Class ที่มีเฉพาะตัว Method Header เท่านั้น ไม่มีการ Implement การทำงานอะไรเลย ซึ่ง Method Header คือ Signature หรือการประกาศ Method ว่ามีชื่ออะไร รับอะไรมาบ้าง ส่วน Logic การทำงานของมันจะไปอยู่ใน Method Detail นั่นเอง
ซึ่ง Interface ในแง่ของ OOP นั้นเป็น Real Abstract หมายความว่า มันไม่มี Logic การทำงานอะไรเลย มาเป็นกรอบคร่าว ๆ เท่านั้นเอง
เวลาที่เราจะสร้าง Interface Class ต้องบอกด้วย Keyword Interface เสมอ และเวลาที่เราประกาศ Method ต่าง ๆ ที่อยู่ใน Class นี้ จะกลายเป็น Abstract ทั้งหมดโดยอัตโนมัติ
// Shape.java
public interface Shape {
public abstract double area();
public double volume(); // ต่อให้ไม่ใส่ abstract ก็จะถูกนับว่าเป็น abstract
}
เมื่อเราต้องการสร้าง Class ที่จะนำ Interface ไปใช้งานต่อนั้น ต้องใส่ keyword “implements” เสมอ และต้องคอยประกาศตัว Method ทุกตัวที่อยู่ใน Interface เสมอ ไม่งั้นโค้ดเราก็จะแดงอยู่อย่างนั้น
// Square.java
public class Square implements Shape {
@Override
public double area() {
// TODO Auto-generated method stub
return 0;
}
@Override
public double volume() {
// TODO Auto-generated method stub
return 0;
}
}
ต่อมาเราก็มาทำความรู้จักกับเจ้าตัว Abstract Class กันเถอะ
Abstract Class นั้นมีรูปแบบที่คล้ายเคียงกับ Interface เลย แต่จะมีข้อกำหนดที่ยืดหยุ่นกว่า เพราะเราสามารถใส่ Method ที่มี Logic เพิ่มลงไปได้ด้วย จากเดิมที่ Interface นั้นทำไม่ได้
เวลาที่เราจะสร้าง Class จะต้องประกาศด้วย Keyword “abstract” ซึ่ง Method ไหนที่เราต้องการให้ Subclass เอาไป Implement ต่อ ต้องมี Keyword “abstract” ระบุ เพื่อไว้ในส่วนของ Method Modifier เสมอ
Method ที่อยู่ใน Class นั้น จะเป็น Abstract หรือไม่เป็นก็ได้ แต่ถ้าไม่เป็นจะต้องเขียน Body ของ Method นั้น ๆ ด้วยเสมอ
// Option.java
public abstract class Option {
public abstract String color(); // ตัวนี้เป็น Abstract
public void sayHi() { // ตัวนี้ไม่ได้เป็น Abstract
System.out.println("Hi");
}
}
เวลาที่ Class จะนำ Abstract Class ไปใช้งานนั้น จะต้องใช้ Keyword “extends” ด้วยเสมอ
// Circle.java
public class Circle extends Option {
@Override
public String color() {
// TODO Auto-generated method stub
return null;
}
}
จากโค้ดเราจะสังเกตเห็นว่าใน Option.java จะมี Method อยู่ 2 ตัว แต่พอเรา Extend มาใช้กับตัว Circle แล้วเรา Implement เพียงแค่ตัวเดียวเท่านั้น คือตัวที่เป็น Abstract ใน Option.java นั่นเอง
โดยรวมแล้วเจ้า Abstract Class กับ Interface นั้น มีสิ่งหนึ่งที่เหมือนกันนั่นก็คือ การที่เราจะเรียกใช้งานทั้งสองนั้น เราจะต้องสร้าง Class ที่ไว้เรียกใช้งานเจ้าสองตัวนี้ก่อน ถึงจะนำตัวที่เรียกใช้งาน Abstract Class กับ Interface ไปใช้งานต่อได้
หมายความว่า เราไม่สามารถสร้าง Class Object จาก Abstract Class กับ Interface โดยตรงได้ จะต้องใช้ Class ที่เรียกใช้ Abstract Class กับ Interface ในการสร้าง Class Object แทน
แล้วทีนี้เราน่าจะพอเข้าใจเกี่ยวกับ Abstract Class กับ Interface กันบ้างไม่น้อย งั้นเรามาสรุปถึงข้อแตกต่างกันระหว่าง ทั้ง 2 ตัวนี้กันเลย !
เป็นอย่างไรกันบ้างครับกับบทความนี้ หวังว่าเพื่อน ๆ ทุกคนจะไดเรียนรู้เกี่ยวกับ Abstract Class และ Interface กันและสามารถเข้าใจถึงความแตกต่างของทั้งสองได้นะครับ