打字稿抽象属性

Ada*_*899 6 oop abstract typescript

几天前我开始学习打字稿。我知道所有主要的 OOP 概念,但我只是不理解抽象属性背后的概念。我知道您必须在子类中覆盖/实现基类的抽象成员。但是,它有什么用?我得到抽象方法背后的概念,但不是这个。如果你能给我一些很好的例子,我将不胜感激。

谢谢!

kay*_*ya3 8

抽象属性的用途与抽象方法类似;readonly 属性在概念上类似于 getter 方法,因此抽象 readonly 属性有点像拥有抽象 getter 方法。

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

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果相同的代码是用 Java 之MyBinaryExpr类的语言编写的,其中属性不能是抽象的,那么该类可能会有一个类似的方法abstract String getOp()用于相同的目的。


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

另一方面,像obj.fieldJava 中的字段访问在编译时根据表达式的编译时类型静态绑定到属于类的字段声明obj。因此,Java 接口不能有抽象字段,因为编译器在编译时不知道要绑定到哪个实际字段声明。所以 Java 的语义不允许抽象字段。另一方面,Javascript(以及 Typescript)在运行时解析所有成员访问,因此即使是属性访问也是动态绑定的。因此,语义允许接口具有抽象属性。