typescript - OOP:方法返回新实例,孩子应该返回什么?
问题描述
我正在使用打字稿。我有一个类,其方法返回该类的新实例。
class A {
map (args) {
return new A(/* change something*/);
}
}
而我的子类A
。
class B extends A {
}
我的问题是:OOP 中是否有最佳实践表明map
函数 inB
应该返回 a B
?或者是否只有开发人员选择返回A
或B
(即使用方法覆盖)。
解决方案
这里没有单一的最佳实践。这取决于map
您希望它具有什么和语义。
对于通常称为 的操作,需要特别考虑的一个数据点map
,例如 Array 上的那个(以及 to filter
、slice
等):默认情况下,Array 中的实现将返回B
(无需您进行任何特殊工作)。但是,如果返回更有意义,则实现可以覆盖该默认行为A
。
使用 Array 的默认行为的示例(在 JavaScript 中,但在 TypeScript 中的工作方式相同):
class B extends Array {
}
const b1 = new B("a", "b", "c");
const b2 = b1.map(entry => entry.toUpperCase());
console.log(b2 instanceof Array); // true
console.log(b2 instanceof B); // true
覆盖 Array 的默认行为的示例(同样,在 JS 中):
class B extends Array {
static get [Symbol.species]() {
return Array;
}
}
const b1 = new B("a", "b", "c");
const b2 = b1.map(entry => entry.toUpperCase());
console.log(b2 instanceof Array); // true
console.log(b2 instanceof B); // false
有关其工作原理的更多信息:Symbol.species
Promise
对导致新承诺(或映射或集合)的操作执行相同的操作(和Map
)Set
,因此您可以争辩说有一些标准库支持B
从类似操作返回的想法。
还是只有开发人员可以选择返回 A 或 B(即使用方法覆盖)。
正确的。
推荐阅读
- byte-buddy - 在 ByteBuddy 中创建数组的 TypeDescryption
- image - 如何在 GIMP 2.10 中编写一个 python 脚本,将当前图像分割成图块,然后将它们保存到单个文件中?
- r - 通过合并 R 中的两列来重塑大型数据框
- python - numpy用填充调整n维数组的大小
- sceneview - 带有 SceneKit 的选项键修饰符 allowCameraControl
- android - 使用 firebaseui:firebase-ui-firestore 构建发布 APK 时出现问题
- javascript - 如果我调用 child.listen(),为什么 Typescript 从父类中调用覆盖的子方法?
- python - 如何通过 importlib 加快导入变量命名模块?
- awk - AWK 从另一个文件的列表中搜索文件并格式化输出
- r - 使用非标准方法在 R 中创建距离矩阵