Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

เมื่อไหร่ควรใช้ Abstract Class และเมื่อไหร่ควรใช้ Interface ใน Java?

Interface สามารถใช้เพื่อกำหนดพฤติกรรมสัญญา (contract behavior) และสามารถทำหน้าที่เป็นสัญญาระหว่างสองระบบเพื่อโต้ตอบ ในขณะที่ abstract class 主要ใช้เพื่อกำหนด default behavior สำหรับ subclasses หมายถึงทุก child classes ควรทำ functionality เดียวกัน

เมื่อไหร่ควรใช้ Abstract Class

  • Abstract class เป็นตัวเลือกที่ดีถ้าเราใช้ inheritance concept เนื่องจากมันให้ common base class implementation แก่ derived classes
  • Abstract class ดีกว่าถ้าเราต้องการประกาศ non-public members ใน interface ทุกเมธอดต้องเป็น public
  • ถ้าเราต้องการเพิ่มเมธอดใหม่ในอนาคต abstract class เป็นตัวเลือกที่ดีกว่า เพราะถ้าเพิ่มเมธอดใหม่ใน interface ทุกคลาสที่ implement interface นั้นแล้วจะต้องเปลี่ยนเพื่อ implement เมธอดใหม่
  • ถ้าต้องการสร้างหลาย version ของ component ให้สร้าง abstract class Abstract classes ให้วิธีง่ายๆ ในการ version components โดยการ update base class ทุก inheriting classes จะได้รับการ update อัตโนมัติ Interfaces ไม่สามารถเปลี่ยนได้หลังสร้าง ถ้าต้องการ version ใหม่ ต้องสร้าง interface ใหม่ทั้งหมด
  • Abstract classes มีข้อได้เปรียบในการ forward compatibility ที่ดีกว่า เมื่อ clients ใช้ interface เราไม่สามารถเปลี่ยนได้ แต่ถ้าใช้ abstract class เรายังเพิ่ม behavior ได้โดยไม่ทำลาย existing code
  • ถ้าต้องการให้ common implemented functionality ระหว่างทุก implementations ของ component ให้ใช้ abstract class Abstract classes อนุญาตให้ partially implement class ในขณะที่ interfaces ไม่มี implementation สำหรับ member ใดๆ

ตัวอย่าง

abstract class Car {
    public void accelerate() {
        System.out.println("Do something to accelerate");
    }
    public void applyBrakes() {
        System.out.println("Do something to apply brakes");
    }
    public abstract void changeGears();
}

ตอนนี้ Car ใดๆ ที่ต้องการ instantiate ต้อง implement changeGears() method

class Alto extends Car {
    public void changeGears() {
        System.out.println("Implement changeGears() method for Alto Car");
    }
}
class Santro extends Car {
    public void changeGears() {
        System.out.println("Implement changeGears() method for Santro Car");
    }
}

เมื่อไหร่ควรใช้ Interface

  • ถ้า functionality ที่เราสร้างจะมีประโยชน์ข้ามหลายๆ objects ที่แตกต่างกัน (disparate) ให้ใช้ interface Abstract classes ควรใช้สำหรับ objects ที่เกี่ยวข้องกันใกล้ชิด ส่วน interfaces เหมาะสำหรับให้ common functionality แก่ unrelated classes
  • Interfaces เป็นตัวเลือกที่ดีเมื่อเราคิดว่า API จะไม่เปลี่ยนแปลงในระยะเวลานาน
  • Interfaces ดีกว่าตอนที่เราต้องการ multiple inheritance เหมือนๆ กัน เนื่องจากเราสามารถ implement multiple interfaces ได้
  • ถ้าเราออกแบบ small, concise bits of functionality ให้ใช้ interfaces ถ้าออกแบบ large functional units ให้ใช้ abstract class

ตัวอย่าง

public interface Actor {
    void perform();
}
public interface Producer {
    void invest();
}

ตอนนี้ actors ส่วนใหญ่ร่ำรวยพอที่จะ produce ภาพยนตร์ของตัวเอง หากเราใช้ interfaces แทน abstract classes เราสามารถ implement Actor และ Producer ทั้งคู่ได้ นอกจากนี้เรายังสามารถกำหนด ActorProducer interface ใหม่ที่ extends ทั้งสองได้

public interface ActorProducer extends Actor, Producer{
    // some statements
}