Typescript OOP:返回新实例的方法,子对象应该返回什么?

Typescript OOP:返回新实例的方法,子对象应该返回什么?,typescript,oop,Typescript,Oop,我在用打字脚本。我有一个类,其方法返回该类的新实例 class A { map (args) { return new A(/* change something*/); } } 我将子类A class B extends A { } 我的问题是:B中的map函数应该返回aB,这在OOP中是否有最佳实践?或者返回A或B(即使用方法覆盖)只是开发人员的选择。这里没有单一的最佳实践。它取决于map的功能以及您希望它具有的语义 一个数据点,具体考虑操作上称为 map < /COD>

我在用打字脚本。我有一个类,其方法返回该类的新实例

class A {
  map (args) {
    return new A(/* change something*/);
  }
}
我将子类
A

class B extends A {
}

我的问题是:
B
中的
map
函数应该返回a
B
,这在OOP中是否有最佳实践?或者返回
A
B
(即使用方法覆盖)只是开发人员的选择。

这里没有单一的最佳实践。它取决于
map
的功能以及您希望它具有的语义

一个数据点,具体考虑操作上称为<代码> map < /COD>,如数组中的一个(和<代码>过滤器< /代码>,代码>切片,等等):默认情况下,数组中的实现将返回<代码> B<代码>(没有任何特殊的工作)。但是,如果返回

A
更有意义,那么实现可以覆盖默认行为

使用数组默认行为的示例(在JavaScript中,但在TypeScript中工作相同):

B类扩展数组{
}
常数b1=新的B(“a”、“B”、“c”);
const b2=b1.map(entry=>entry.toUpperCase());
console.log(b2 instanceof数组);//真的

console.log(b2 instanceof B);//理想情况下,
map
不会硬编码
A
,而是在调用的任何类的实例中返回
map
。(作为Python中的一个类比,您将定义为类方法
defmap(cls):返回cls(…)
而不是
defmap(cls):返回a(…)
)为了一致性,您不会期望
B
.map返回
a
@chepner-对于像Array这样的内置类,您会很高兴知道这正是JavaScript所需要的(因此,TypeScript)不起作用。:-)