在TypeScript中,接口(interface)和抽象类(abstract class)有何区别?

21 浏览
0 Comments

在TypeScript中,接口(interface)和抽象类(abstract class)有何区别?

我写了几行代码来实验和区分这两者:接口(interface)和抽象类(abstract class)。

我发现它们有相同的限制。

接口IPerson{

名字: 字符串;

说话(): 空;

}

接口IVIP{

代码: 数字;

}

抽象类人{

抽象 名字: 字符串;

抽象 说话(): 空;

}

类管理者类型1 扩展自 人{

// 我得到的错误是我需要实现基类的说话()方法和名字属性。

}

类管理者类型2 实现 IPerson{

// 我得到的错误是我需要实现接口的说话()方法和名字属性。

}

类管理者类型3 实现 IPerson, IVIP{

// 现在我得到的错误是我需要将所有实现的接口的属性和方法都实现到派生类中。

}

根据我发现的,这两者之间没有明显的区别,因为它们都实现了相同的限制。我唯一注意到的是继承和实现。

  1. 一个类只能继承一个基类
  2. 一个类可以实现多个接口。

我理解得对吗?如果是这样,什么时候我需要使用其中一个?

更新

我不知道这是否是正确答案,但你可以根据情况使用两者。面向对象编程真的很酷。

类管理者类型3 扩展自 人 实现 IPerson, IVIP{

// 现在的限制是你需要将基类的所有抽象属性和方法都实现,并且将接口的所有属性和方法也实现。

}

0
0 Comments

在TypeScript中,抽象类和接口之间有一些区别。下面将讨论它们的出现原因以及解决方法。

抽象类是用来作为其他类的父类,不能直接创建对象,因为它没有完整的实现。抽象类可以实现一个或多个接口。抽象类可以包含一些方法的实现,这些方法可以引用尚未实际存在的其他方法。抽象类编译为JavaScript函数。

接口不像抽象类那样实现方法或定义构造函数,只是定义了一个形状。接口通过implements关键字实现。接口可以像类一样进行扩展,但抽象类只能作为父类。接口没有JavaScript等效物,并且TypeScript编译器生成的JavaScript代码中不包含接口的详细信息。这意味着无法使用instanceof关键字来缩小接口类型。

- 抽象类是用来作为其他类的父类,不能直接创建对象,可以实现接口并包含方法的实现。

- 接口定义了一个形状,可以被类通过implements关键字实现,可以进行扩展,但不能作为父类。

- 抽象类编译为JavaScript函数,而接口没有JavaScript等效物。

通过理解抽象类和接口的区别,我们可以根据具体的需求选择使用抽象类或接口来设计我们的类和对象。

0
0 Comments

在TypeScript中,接口和抽象类之间有一个更大的区别,即(抽象)类在运行时可用,而接口仅在编译时可用。这意味着您不能使用instanceof与接口。如果您不真正需要运行时类型,例如上面的示例,或者只希望在具体类中有实现,那么请使用接口。由于接口仅在编译时可用,生成的JS文件的大小将更小。

所以,为什么会有这个问题呢?问题的原因是因为在TypeScript中,接口和抽象类有不同的用途和特性。接口主要用于描述对象的形状,它定义了对象应该具有的属性和方法。而抽象类用于定义一种通用的类,它可以包含一些通用的属性和方法,并且可以被其他类继承和实现。

解决这个问题的方法是根据具体的需求选择使用接口还是抽象类。如果您只需要描述对象的形状,并且不需要在运行时进行类型检查,那么使用接口是最合适的选择。如果您需要定义一些通用的属性和方法,并且希望这些属性和方法在具体的类中有具体的实现,那么使用抽象类是更好的选择。

总结起来,接口和抽象类在TypeScript中有不同的用途和特性。接口用于描述对象的形状,抽象类用于定义通用的类并且可以被其他类继承和实现。根据具体的需求选择使用接口还是抽象类。如果只需要描述对象的形状,使用接口;如果需要定义通用的属性和方法,并且希望具体的类有具体的实现,使用抽象类。

0
0 Comments

在TypeScript中,接口(interface)和抽象类(abstract class)是两种不同的方式来解决问题。

接口是一个定义属性和对象实现的能力的合同。通过接口,可以定义一个“电工”和一个“水暖工”可以做什么:

interface Electrician {
  layWires(): void
}
interface Plumber {
  layPipes(): void
}

然后,可以使用接口的服务:

function restoreHouse(e: Electrician, p: Plumber) {
  e.layWires()
  p.layPipes()
}

注意,实现接口的方式是自由的。可以通过实例化一个类,或者使用一个简单的对象来实现:

let iAmAnElectrician = {
  layWires: () => { console.log("Work with wires…") }
}

接口在运行时根本不存在,因此无法进行内省。它是经典的JavaScript方式来处理对象编程,但在编译时对定义的合同有良好的控制。

抽象类既是合同,也是工厂的实现。抽象类也是一个实现,但是是不完整的。尤其是,抽象类在运行时存在,即使它只有抽象方法(那么可以使用instanceof)。

当定义一个抽象类时,通常会尝试控制一个过程的实现方式。例如,可以这样写:

abstract class HouseRestorer {
  protected abstract layWires(): void
  protected abstract layPipes(): void
  restoreHouse() {
    this.layWires()
    this.layPipes()
  }
}

这个抽象类HouseRestorer定义了方法layWireslayPipes的使用方式,但是由子类来实现特定的处理,然后才能使用。

抽象类是一种传统的面向对象编程方法,在JavaScript中并不常见。

两种方法都可以完成相同的任务。它们是解决问题的两种不同方式。

0