使用接口进行多态性
使用接口实现多态的主要原因,并通过实现接口的方法,让开发人员在将来以自己的方式实现。
假设我们有一个接口和三个类:
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 紧密结合。这里的接口通过多态解决了我们的问题。