什么是多态
在父类中定义的属性和方法被子类继承后,可以有不同的实现
用一个业务场景辅助理解
比如要写一个h5登录,登录到企业微信,钉钉,即登录到不同的平台,就有不同的登录方式
下面的代码就是模拟了一个简单的登录过程
//h5登录,登录到企微,钉钉
///实现了一个多态的登录系统,允许用户通过不同的平台(如钉钉、企微、支付宝)进行登录。
// 每个平台都有自己的登录逻辑,但它们都继承自一个抽象基类 BaseLogin,
// 该基类定义了登录的通用流程
function login(phone:string) {
return `${phone}登录成功`
}
//这是一个抽象类,定义了登录的通用流程。
// 它包含一个抽象方法 getUsrInfo,
// 该方法需要在子类中实现,用于获取用户信息
abstract class BaseLogin {
protected abstract getUsrInfo():Promise<{ phone: string}>
async login() {
const userInfo = await this.getUsrInfo()
const token = login(userInfo.phone)
this.afterLogin(token)
console.log('登录成功')
}
private afterLogin(token:string) {
console.log(`登录成功,token:${token},保存到本地`)
}
}
//子类 DingTalkLogin,并实现了 getUsrInfo 方法,用于获取各自平台的用户信息。
class DingTalkLogin extends BaseLogin {
async getUsrInfo() {
//获取钉钉的用户信息
console.log('获取钉钉的用户信息')
//模拟请求
await new Promise((resolve)=>setTimeout(resolve,1000))
return { phone: '123456' }
}
}
//子类 QiweiLogin
class QiweiLogin extends BaseLogin {
async getUsrInfo() {
//获取企微的用户信息
console.log('获取企微的用户信息')
//模拟请求
await new Promise((resolve)=>setTimeout(resolve,1000))
return { phone: '654321' }
}
}
//子类 AliPayLogin
class AliPayLogin extends BaseLogin {
async getUsrInfo() {
//获取支付宝的用户信息
console.log('获取支付宝的用户信息')
//模拟请求
await new Promise((resolve)=>setTimeout(resolve,1000))
return { phone: '123456' }
}
}
//工厂函数 loginFactory,
// 根据传入的 type 参数(如 'dingTalk', 'qiwei', 'aliPay'),
// 返回对应的登录实例
const loginMap = {
dingTalk: DingTalkLogin,
qiwei: QiweiLogin,
aliPay:AliPayLogin
}
function loginFactory(type:keyof typeof loginMap) {
return loginMap[type]()
}
//调用实例 需要哪个平台的登录就传入对应的key
loginFactory('dingTalk').login()