几天前我开始学习打字稿。我知道所有主要的 OOP 概念,但我只是不理解抽象属性背后的概念。我知道您必须在子类中重写/实现基类的抽象成员。但是,它有什么用呢?我了解抽象方法背后的概念,但不是这个。
如果您能为我提供一些很好的例子,我将非常感激。
谢谢你!
抽象属性的有用之处与抽象方法类似;只读属性在概念上与 getter 方法类似,因此抽象只读属性有点像具有抽象 getter 方法。
例如,假设您有一个用于表示表达式的树结构:您可能有一个用于二进制表达式的抽象类,并且为了避免重复,toString
方法可能想要利用this.op
string 属性,用于在字符串表示中使用适当的符号(例如'+'
)。下面的代码显示了可能的层次结构中的两个类:
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();
}
}
如果相同的代码是用 Java 等属性不能抽象的语言编写的,则MyBinaryExpr
类可能有一个类似的方法abstract String getOp()
出于同样的目的。
与 Java 相比,另一件值得注意的事情是,在 Java 中,只有抽象方法才有意义,因为 Java 中的方法调用是动态调度 https://en.wikipedia.org/wiki/Dynamic_dispatch到运行时属于对象类的具体方法。当某些代码调用抽象方法时,该调用(通常)不能在编译时绑定到具体实现,因此必须在运行时选择具体方法。
另一方面,字段访问如obj.field
在Java中是静态束缚 https://en.wikipedia.org/wiki/Name_binding在编译时根据表达式的编译时类型到属于类的字段声明obj
。因此 Java 接口不能有抽象字段,因为编译器在编译时不知道要绑定到哪个实际字段声明。所以Java的语义不允许抽象字段。另一方面,Javascript(以及 Typescript)在运行时解析所有成员访问,因此即使属性访问也是动态绑定的。因此,语义允许接口具有抽象属性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)