09 December 2011

Abstract Class VS Interface

Abstract Class
abstract class เป็นคลาสที่จะมี abstract method อยู่ด้วยหรือไม่ก็ได้

abstract class Test{
 public String a(){
  return "hello";
 }
 public abstract String b();
}

จากตัวอย่างจะเห็นว่ามี method b() เป็น abstract method และมี method a() เป็น method ปกติ ซึ่งใน abstract method นั้น จะไม่มี body(บางที่เรียก stagement ) อยู่ภายในมันดังนั้นหลัง method จึงไม่มีเครื่องหมายปีกกาครับ
abstract นั้นจะทำหน้าที่เหมือนคลาสแม่ปกติทั่วไปคือเราสามารถนำไป extends ได้ แต่ที่ต้องประกาศ abstract ไว้เพราะมีบาง method นั้นเรายังไม่สามารถระบุอะไรลงไปได้ ถ้าหากมองในโลกของความจริงคือ ผมมีคลาสประกอบด้วย

abstract class สิ่งมีชีวิต{
 public abstract String ร้อง();
}

public class เป็ด extends สิ่งมีชีวิต{
 @Override
 public String ร้อง(){
  return "ก๊าบๆ";
 }
}

public class หมู extends สิ่งมีชีวิต{
 @Override
 public String ร้อง(){
  return "อู๊ดๆ";
 }
}

จากตัวอย่างจะเห็นได้ว่า คลาส สิ่งมีชีวิตของผมนั้น สามารถร้องได้ แต่ไม่รู้ว่ามันร้องยังไง ผมจึงทำ abstract ไว้ว่ามันร้องได้ ทีนี้เมื่อเอาไป extends ให้เป็ด และ หมู ซึ่งเป็นคลาสลูก ผมก็ต้องไปกำหนดให้มันว่า มันร้องอย่างไร

Interface
Interface นั้นมีแต่ abstract method เท่านั้น แต่ละ method จะไม่มี body ไม่มี value และไม่มีการ implementation
interface ถ้ามองอีกมุมมันก็คือ protocol หรือพูดในแบบบ้านๆคือ ภาษาที่ใช้ในการสื่อสารนั้นเองครับ เช่น

นายA implement ภาษาไทย
นายB implement ภาษาไทย,ภาษาอังกฤษ
นายC implement ภาษาอังกฤษ

โดยในที่นี่ ภาษาไทย และ ภาษาอังกฤษ ก็คือ interface นั้นเอง

แสดงว่านาย A นั้นสามารถคุยกับนาย B รู้เรื่องด้วยภาษาไทย แต่นาย A จะคุยกับนาย C ไม่รู้เรื่องเพราะนาย C ไม่ได้ implement ภาษาไทย หรือ นาย A ไม่ได้ implement ภาษาอังกฤษ
นาย B สามารถคุยได้ทั้ง นาย A และ นาย C เพราะนาย B implement ทั้งภาษาไทยและอังกฤษ

ลักษณะการเขียน Interface คือ

interface Test{
 public  String a();
 public  String b();
 public  String c(String data);
}

ซึ่งจะเห็นว่าผมไม่ได้ใส่ abstract ไว้หน้า method เพราะว่าแต่ละ method ใน interface ต้องเป็น abstract อยู่แล้ว และแต่ละ method นั้นต้องไม่มี body ซึ่งถ้าลองเปรียบเทียบดูกับด้านบนอาจจะพอเห็นข้อแตกต่างกันบ้างครับ ซึ่งการสร้าง interface ทุกครั้งที่ implement ไปด้วย override ทุกตัวที่มีทั้งหมด

class TestImpl implements Test{
 @Override
 public  String a(){
  //body
 }
 @Override
 public  String b(){
  //body
 }
 @Override
 public  String c(String data){
  //body
 }
}

ซึ่งตรงส่วนที่เป็น //body นั้นคือส่วนของ body ที่ต้องต้องเพิ่มเติมเมื่อ implement interface มาครับ

1 comments:

Anonymous said...

อธิบายได้ดีมากครับ

Post a Comment