在这篇文章中,我们将学习Typecript中多态性概念的基本指南。
多态性教程简介
多态是面向对象编程的概念之一。其他概念包括类、接口、封装和抽象类。
多态性是指一个类中一个函数或方法的多种形式
Typescript以多种方式支持多态性概念:
- 函数重载
- 函数重载
- 接口
方法重写
方法重写允许子类提供一个已经由超类或父类提供的函数或方法的实现。
子类将可以访问超类的所有公共方法和属性。
规则
在子类中声明的函数必须与父类的名称相同。
父类和子类中函数的参数是相同的
子类由父类扩展或遵循继承。
例子
在这里,我们已经声明了父类和子类。父类是由子类扩展而来。这两个类有相同的方法名processName()
这里processName()在子类中被覆盖并提供了一个实现。
class Parent {
name: string;
constructor(name: string) {
this.name = name;
}
processName() {
console.log('processName method in parent class',name)
}
}
class Child extends Parent {
constructor(name: string) {
super(name);
}
processName() {
console.log('processName method in Child class',name)
}
}
let myObject = new Child("Kiran");
myObject.processName()
let myObject1= new Parent("john");
myObject1.processName()
输出:
processName method in Child class
processName method in parent class
方法或函数重载
函数重载意味着一个方法有多个签名。每种编程语言都提供同样的功能。但是Typescript以一种不同的方式支持。
例如,在Typescript中,我们可以用不同的参数编写多个方法,如下所示
class MyClass {
constructor() {
}
mymethod() {
console.log('method with No argument');
}
mymethod(name: string) {
console.log('method with string argument');
}
}
let myclass = new MyClass();
console.log(myclass.mymethod());
这将不会被编译,并给出一个错误的重复函数实现。
原因是Typecode转换为javascript,而javascript没有重载语法的支持。
那么typescript是如何支持函数重载的呢?
是的,它以一种不同的方式支持函数重载,使用任意数据类型或可选参数语法。
你可以查看我的另一篇博文:Typecript中的函数重载
多态性 接口或鸭子的类型
例如,我们有一个接口--DatabaseConnection,它有一个唯一的抽象方法--connect(),用来连接数据库,如果成功返回>0,如果失败则返回0或-1。
interface DatabaseConnection{
connect(): number;
}
我们将为DatabaseConnection接口提供一个实现。让我们说,为MySQL数据库提供一个实现。MySQLConnection为MySQL数据库提供了connect()方法的实现。
export class MySQLConnection implements DatabaseConnection{
public connect(): number{
console.log("Open HTTP Connection");
console.log("Connection Established");
return 1;
}
}
另外,为MongoDB提供数据库连接机制。MongoDBConnection为MongoDB数据库提供了connect()方法的实现。
export class MongoDBConnection implements DatabaseConnection{
public connect(): number{
console.log("Open HTTP Connection");
console.log("Connection Established");
return 1;
}
}
下一步是编写一个连接到数据库的客户端代码。
DatabaseTest类被创建,并通过注入DatabaseConnection提供构造函数。
这是一个使用接口注入构造函数的例子。所以你在这里传递的是接口,而不是实现。
客户端不需要知道是连接到MySQL还是MongoDB或者其他什么东西?
传递接口的好处是灵活性和组件之间的松散耦合,并且易于对组件进行单元测试。Db的实现是在Runtime决定的。这就是所谓的多态性接口。
这增加了更多的灵活性,使客户能够配置
export class DatabaseTest {
constructor(private dbConnection: DatabaseConnection) {
dbConnection.connect()
}
}
如果我们在构造函数中注入实现类MongoDBConnection,这就是紧耦合,并且不能为未来的实现进行扩展。