使用接口进行多态性

使用接口实现多态的主要原因,并通过实现接口的方法,让开发人员在将来以自己的方式实现。

假设我们有一个接口和三个类:

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 紧密结合。这里的接口通过多态解决了我们的问题。