ทำไมต้องมีอินเตอร์เฟซ ??????
มันเริ่มต้นด้วยสุนัข โดยเฉพาะอย่างยิ่งปั๊ก
ปั๊กมีพฤติกรรมหลากหลาย:
public class Pug {
private String name;
public Pug(String n) { name = n; }
public String getName() { return name; }
public String bark() { return "Arf!"; }
public boolean hasCurlyTail() { return true; } }
และคุณมีลาบราดอร์ซึ่งมีชุดของพฤติกรรม
public class Lab {
private String name;
public Lab(String n) { name = n; }
public String getName() { return name; }
public String bark() { return "Woof!"; }
public boolean hasCurlyTail() { return false; } }
เราสามารถทำดัชชุนด์และแล็บ:
Pug pug = new Pug("Spot");
Lab lab = new Lab("Fido");
และเราสามารถเรียกใช้พฤติกรรมของพวกเขา:
pug.bark() -> "Arf!"
lab.bark() -> "Woof!"
pug.hasCurlyTail() -> true
lab.hasCurlyTail() -> false
pug.getName() -> "Spot"
สมมติว่าฉันใช้สุนัขสุนัขและฉันต้องติดตามสุนัขทั้งหมดที่ฉันอยู่อาศัย ฉันต้องเก็บดัชชุนด์และลาบราดอร์ของฉันในอาร์เรย์แยกต่างหาก :
public class Kennel {
Pug[] pugs = new Pug[10];
Lab[] labs = new Lab[10];
public void addPug(Pug p) { ... }
public void addLab(Lab l) { ... }
public void printDogs() { // Display names of all the dogs } }
แต่นี่ไม่ชัดเจน ถ้าฉันต้องการบ้านพุดเดิ้ลด้วยฉันต้องเปลี่ยนคำจำกัดความของ Kennel เพื่อเพิ่มพุดเดิ้ลมากมาย ที่จริงแล้วฉันต้องการชุดสุนัขแยกต่างหากสำหรับสุนัขแต่ละประเภท
Insight: ดัชชุนด์และลาบราดอร์ (และพุดเดิ้ล) เป็นสุนัขประเภทหนึ่งและมีพฤติกรรมเหมือนกัน นั่นคือเราสามารถพูดได้ (เพื่อจุดประสงค์ของตัวอย่างนี้) ว่าสุนัขทุกตัวสามารถเห่ามีชื่อและอาจมีหรือไม่มีหางหยักก็ได้ เราสามารถใช้อินเทอร์เฟซเพื่อกำหนดสิ่งที่สุนัขทุกคนสามารถทำได้ แต่ปล่อยให้มันขึ้นอยู่กับประเภทของสุนัขที่เฉพาะเจาะจงเพื่อใช้พฤติกรรมเหล่านั้น อินเทอร์เฟซบอกว่า "นี่คือสิ่งที่สุนัขทุกคนสามารถทำได้" แต่ไม่ได้บอกว่าพฤติกรรมแต่ละอย่างนั้นทำได้อย่างไร
public interface Dog
{
public String bark();
public String getName();
public boolean hasCurlyTail(); }
จากนั้นฉันเปลี่ยนคลาส Pug และ Lab เล็กน้อยเพื่อใช้พฤติกรรมสุนัข เราสามารถพูดได้ว่าปั๊กเป็นสุนัขและแล็บเป็นสุนัข
public class Pug implements Dog {
// the rest is the same as before }
public class Lab implements Dog {
// the rest is the same as before
}
ฉันยังสามารถยกตัวอย่าง Pugs และ Labs เหมือนที่เคยทำ แต่ตอนนี้ฉันได้รับวิธีใหม่ในการทำเช่นนี้:
Dog d1 = new Pug("Spot");
Dog d2 = new Lab("Fido");
นี่บอกว่า d1 ไม่ได้เป็นเพียงสุนัข แต่เป็นปั๊กโดยเฉพาะ และ d2 นั้นก็เป็น Dog โดยเฉพาะแล็บ เราสามารถเรียกใช้พฤติกรรมและพวกเขาทำงานเหมือนก่อนหน้านี้:
d1.bark() -> "Arf!"
d2.bark() -> "Woof!"
d1.hasCurlyTail() -> true
d2.hasCurlyTail() -> false
d1.getName() -> "Spot"
นี่คือที่ทำงานพิเศษทั้งหมดจ่ายออก คลาส Kennel นั้นง่ายกว่ามาก ฉันต้องการเพียงอาร์เรย์เดียวและหนึ่งวิธีการเพิ่ม ทั้งสองจะทำงานกับวัตถุใด ๆ ที่เป็นสุนัข นั่นคือวัตถุที่ใช้อินเตอร์เฟซ Dog
public class Kennel {
Dog[] dogs = new Dog[20];
public void addDog(Dog d) { ... }
public void printDogs() {
// Display names of all the dogs } }
นี่คือวิธีการใช้งาน:
Kennel k = new Kennel();
Dog d1 = new Pug("Spot");
Dog d2 = new Lab("Fido");
k.addDog(d1);
k.addDog(d2);
k.printDogs();
คำสั่งสุดท้ายจะแสดง: Spot Fido
อินเทอร์เฟซให้ความสามารถในการระบุชุดของพฤติกรรมที่คลาสทั้งหมดที่ใช้อินเทอร์เฟซจะใช้ร่วมกัน ดังนั้นเราสามารถกำหนดตัวแปรและคอลเลกชัน (เช่นอาร์เรย์) ที่ไม่จำเป็นต้องรู้ล่วงหน้าว่าจะมีวัตถุเฉพาะประเภทใดเพียงพวกเขาจะเก็บวัตถุที่ใช้อินเทอร์เฟซ