使用介面進行多型性
使用介面實現多型的主要原因,並通過實現介面的方法,讓開發人員在將來以自己的方式實現。
假設我們有一個介面和三個類:
interface Connector{
doConnect(): boolean;
}
這是聯結器介面。現在我們將實現 Wifi 通訊。
export class WifiConnector implements Connector{
public doConnect(): boolean{
console.log("Connecting via wifi");
console.log("Get password");
console.log("Lease an IP for 24 hours");
console.log("Connected");
return true
}
}
在這裡,我們開發了名為 WifiConnector
的具體類,它具有自己的實現。這是現在的型別 Connector
。
現在我們正在建立我們的 System
,它有一個元件 Connector
。這稱為依賴注入。
export class System {
constructor(private connector: Connector){ #inject Connector type
connector.doConnect()
}
}
constructor(private connector: Connector)
這條線在這裡非常重要。Connector
是一個介面,必須有 doConnect()
。由於 Connector
是一個介面,這個類 System
具有更大的靈活性。我們可以通過任何實現了 Connector
介面的 Type。在未來的開發人員中獲得更大的靈活例如,現在開發人員想要新增藍芽連線模組:
export class BluetoothConnector implements Connector{
public doConnect(): boolean{
console.log("Connecting via Bluetooth");
console.log("Pair with PIN");
console.log("Connected");
return true
}
}
看到 Wifi 和藍芽有自己的實現。有不同的連線方式。但是,因此兩者都實現了型別 Connector
,現在是型別 Connector
。這樣我們就可以將任何這些傳遞給 System
類作為建構函式引數。這稱為多型性。類 System
現在還沒有意識到它是否是藍芽/ Wifi,即使我們可以通過實現 Connector
介面新增另一個通訊模組,如 Inferade,Bluetooth5 和任何東西。
這叫做鴨子打字 。Connector
型別現在是動態的,因為 doConnect()
只是一個佔位符,開發人員將其作為他/她自己實現。
如果在 constructor(private connector: WifiConnector)
那裡,WifiConnector
是一個具體的類會發生什麼?然後 System
類將只與 WifiConnector 緊密結合。這裡的介面通過多型解決了我們的問題。