什么是多態(tài)
在父類中定義的屬性和方法被子類繼承后,可以有不同的實現(xiàn)
用一個業(yè)務場景輔助理解
比如要寫一個h5登錄,登錄到企業(yè)微信,釘釘,即登錄到不同的平臺,就有不同的登錄方式
下面的代碼就是模擬了一個簡單的登錄過程
//h5登錄,登錄到企微,釘釘
///實現(xiàn)了一個多態(tài)的登錄系統(tǒng),允許用戶通過不同的平臺(如釘釘、企微、支付寶)進行登錄。
// 每個平臺都有自己的登錄邏輯,但它們都繼承自一個抽象基類 BaseLogin,
// 該基類定義了登錄的通用流程
function login(phone:string) {
return `${phone}登錄成功`
}
//這是一個抽象類,定義了登錄的通用流程。
// 它包含一個抽象方法 getUsrInfo,
// 該方法需要在子類中實現(xiàn),用于獲取用戶信息
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,并實現(xiàn)了 getUsrInfo 方法,用于獲取各自平臺的用戶信息。
class DingTalkLogin extends BaseLogin {
async getUsrInfo() {
//獲取釘釘?shù)挠脩粜畔? console.log('獲取釘釘?shù)挠脩粜畔?)
//模擬請求
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' }
}
}
//工廠函數(shù) loginFactory,
// 根據(jù)傳入的 type 參數(shù)(如 'dingTalk', 'qiwei', 'aliPay'),
// 返回對應的登錄實例
const loginMap = {
dingTalk: DingTalkLogin,
qiwei: QiweiLogin,
aliPay:AliPayLogin
}
function loginFactory(type:keyof typeof loginMap) {
return loginMap[type]()
}
//調(diào)用實例 需要哪個平臺的登錄就傳入對應的key
loginFactory('dingTalk').login()