打字稿抽象属性

时间:2020-01-13 18:44:53

标签: typescript oop abstract

几天前,我开始学习打字稿。我了解所有主要的OOP概念,但我只是不了解抽象属性背后的概念。我了解您必须重写/实现子类中基类的抽象成员。但是,它的用途是什么?我得到抽象方法背后的概念,但事实并非如此。 如果您能为我提供一些很好的例子,我将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:4)

由于类似抽象方法的原因,抽象属性很有用;只读属性在概念上与吸气方法类似,因此抽象只读属性有点像具有抽象吸气方法。

例如,假设您有一个用于表示表达式的树结构:您可能有一个二进制表达式的抽象类,并且为了避免重复,toString方法可能要使用{{1} }字符串属性,用于在字符串表示形式中使用的适当符号(例如this.op)。下面的代码显示了可能的层次结构中的两个类:

'+'

如果相同的代码是用Java之类的语言编写的,其中的属性不能是抽象的,则abstract class MyBinaryExpr extends MyExpr { constructor(readonly left: MyExpr, readonly right: MyExpr) { super(); } abstract readonly op: string; toString(): string { return '(' + this.left + this.op + this.right + ')'; } } class MyAdd extends MyBinaryExpr { op = '+'; compute(): number { return this.left.compute() + this.right.compute(); } } 类可能会出于相同的目的而使用类似MyBinaryExpr的方法。


与Java相比,还有另一件值得注意的事情是,在Java中,具有抽象方法仅是有意义的,因为在运行时Java中的方法调用是属于对象类的具体方法的dynamically dispatched。当某些代码调用抽象方法时,该调用(通常)不能在编译时绑定到具体实现,因此必须在运行时选择具体方法。

另一方面,根据表达式{{1}的编译时类型,像Java中的abstract String getOp()这样的字段访问在编译时statically bound属于属于一个类的字段声明}。因此,Java接口不能具有抽象字段,因为编译器在编译时不知道要绑定到哪个实际字段声明。因此,Java的语义不允许抽象字段。另一方面,Javascript(因此是Typescript)在运行时解析所有成员访问,因此,甚至属性访问也被动态绑定。因此,语义允许接口具有抽象属性。