面向对象三要素之一的多态

什么是多态

在父类中定义的属性和方法被子类继承后,可以有不同的实现
用一个业务场景辅助理解
比如要写一个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()
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容