เรียน Java เพื่อนำไปสร้าง Application ระดับโลก [8]


Interface, Abstract และ Polymophism

คงเป็นการดีถ้าหากเราออกแบบระบบที่ feature สามารถเพิ่มขึ้นได้เรื่อยเหมือน jigsaw
ที่ถ้ารูปร่างหรือ Spec ของชิ้นส่วนตรงกันก็นำมาต่อขยายได้เลย

จุดแข็งของ Java ก็คือ interface ซึ่งทำหน้าที่เป็น document specifications ที่บอก
ว่ามี method หรือ parameters และ return อะไรบ้าง ทำให้สามารถเรียกใช้งาน
interface นั้นโดยไม่ต้องสนใจวิธีการ implement เช่น

interface Service {

      void register(String name, String password);

}

เป็นการประกาศ interface Service ซึ่งมี public method void register
แม้ว่าจะไม่ได้ใส่ modifier public แต่ compiler ก็จะจัดการทำให้เป็น public ทุก 
method สังเกตุว่าจะไม่มี body ของ method register

ส่วนการนำ interface ไป implements ทำได้ดังนี

class AService implements Service {

      public void register(String name, String password) {

            //..//  

      }

}

เราสามารถ ประกาศ reference ของ Interface นั้นเช่น

Service service = new AService();
service.register("My name","***");

ภาษา Java ยอมให้ implement interface มากกว่า 1 ตัวเช่น

interface Container {

       void deploy(Object object);

}

class BService implements Container, Service {

      public void register(String name, String password) {

            //..//  

      }

      public void deploy(Objet object) {

      }

}

อย่าลืมว่าต้อง implement Method ให้ครบตามที่ประกาศไว้ในทุก interface ที่นำ
มา implement จากตัวอย่างทำให้เราสามารถสร้าง reference ของทั้งสอง interface
มาถือ instance ของ BService ได้ เช่น

Container c = new BService();
Service s = new BService();

หรือแม้กระทั่ง ทำการ casting ข้าม interface กันได้เช่น

Container c = new BService();
Service s = (Service)c;

การประกาศ Method ใน interface จะถูก Compiler แปลงให้เป็น public
ส่วนการประกาศ data member จะถูกทำให้เป็น public static final 
และต้องกำหนดค่าเริ่มต้นเสมอ เช่น

interface A {

int i=0;
void test();

}

จะเป็น

interface A {

public static final i=0;
public void test();

}

หมายเหตุ: Modifier ของ Data members ใน interface จะเป็นได้แค่ 
               public, static, final ซึ่งไม่จำเป็นต้องครบทั้งสามตัวก็ได้

Abstract

บ่อยครั้งที่เราจำเป็นต้องสร้าง class เพื่อให้คนอื่นนำไป inherit ได้เท่านั้น ที่ไม่สามารถ new instance ได้เนื่องจาก Abstract class คือ class ที่ยังไม่สมบูรณ์ อาจจะ
implement แค่บาง Method ส่วน บาง Method ต้องการให้นักพัฒนาคนอื่นเอาไป 
implement ต่อตามแต่ลักษณะงาน

เราสามารถประกาศ Abstract class ได้ดังนี้

abstract class A {

}

แค่นี้ class A ก็ไม่สามารถ new instance ได้แล้ว ทีนี้เราสามารถระบุ method ที่ยัง
abstract อยู่ได้ดังนี้

abtract class A {

void init() {

      System.out.println("init");

}

abstract void print();//abstract method

}

หาก class ใดมีการประกาศ abstract ที่หน้า method แล้วล่ะก็ เราจำเป็นต้องวาง
abstract ไว้หน้า class ด้วย แม้จะเป็นการ inherit ก็ตาม เช่น

class B {

       abstract void print();//Compile Error! ต้อง ประกาศ abstract หน้า class B

}

หรือ

class B extends A {

} // Compile Error เพราะยังไม่มีการ implements method print() แก้ไขได้โดยประกาศเป็น abstract class B

แม้กระทั่งการ implements interface หากเรายังไม่ต้องการ implement บาง method
เราก็สามารถละไว้โดยการประกาศ class นั้นเป็น abstract ได้เช่น

interface A {

void test();

}

abstract class B implements A {

} //Correct!

มีตัวอย่างหนึ่งที่น่าสนใจเกี่ยวกับ interface และ class คือ

class A {

        void test() {

              System.out.println("A");

        }

}

interface I {

        void test();

}

จากตัวอย่างนี้เราสามารถนำ class A มา plug กับ interface I ได้ วิธีที่ง่ายที่สุดคือ

class B extends A implements I {

}

เท่านี้เราก็สามารถสร้าง reference ของ I มาถือ instance ของ B ซึ่งเป็น sub class
ของ A ได้

Polymophism

คงจะเป็นการดีอีกเหมือนกันหากระบบเราสามารถต่อขยายโดยใ้ช้มาตรฐานเดิม
แต่รูปแบบการทำงานหลากหลายโดยการนำความรู้เรื่อง inherit, override, abstract
และ interface มาประยุกต์ใช้ เช่น

//interface เพื่อรองรับการติดต่อกับ Database
interface DBConnector {

    void connect(String connectionString);

}

//abstract class ของ DBConnector ที่สามารถ initial network setup ได้
abstract class AbstractDBConnector implements
DBConnector{
    AbstractDBConnector() {
        init();
    }

    final void init() {

         System.out.println("Initialize network..");
        
     }

}

//class ซึ่ง implement โดยบริษัท IBM สำหรับ connect ไปยัง DB2 
class DB2Connector extends AbstractDBConnector {

    public void connect(String connectionString) {

           System.out.println("DB2 connect.."+connectionString);

     }

}

//class ซึ่ง implement โดยบริษัท Oracle สำหรับ connect ไปยัง Oracle 
class OracleConnector extends AbstractDBConnector {

    public void connect(String connectionString) {

           System.out.println("Oracle connect.."+connectionString);

     }

}

//เรียกใช้งานโดยระบบของเรา
class DBClient {

   static void connect(DBConnector connector, String connectionString) {

          connector.connect(connectionString);

   }

   public static void main(String[]args) {

          connect(new DB2Connector(),"localhost");

          connect(new OracleConnector(),"localhost");

   }

}

 

คำสำคัญ (Tags): #java
หมายเลขบันทึก: 386370เขียนเมื่อ 19 สิงหาคม 2010 20:26 น. ()แก้ไขเมื่อ 22 พฤศจิกายน 2023 14:37 น. ()สัญญาอนุญาต: ครีเอทีฟคอมมอนส์แบบ แสดงที่มา-ไม่ใช้เพื่อการค้า-อนุญาตแบบเดียวกันจำนวนที่อ่านจำนวนที่อ่าน:


ความเห็น (1)

ด.ช.โยธการณ์ ผิวผาด เลขที่30 ม.2/3

พบปัญหาการใช้งานกรุณาแจ้ง LINE ID @gotoknow
ClassStart
ระบบจัดการการเรียนการสอนผ่านอินเทอร์เน็ต
ทั้งเว็บทั้งแอปใช้งานฟรี
ClassStart Books
โครงการหนังสือจากคลาสสตาร์ท