代码之家  ›  专栏  ›  技术社区  ›  jeanpaul62

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

  •  1
  • jeanpaul62  · 技术社区  · 6 年前

    class A {
      map (args) {
        return new A(/* change something*/);
      }
    }
    

    我是子类 A

    class B extends A {
    }
    

    我的问题是:OOP中是否有一个最佳实践表明 map 中的函数 B B ? 还是只是开发商的选择 A. (即使用方法覆盖)。

    1 回复  |  直到 6 年前
        1
  •  2
  •   T.J. Crowder    6 年前

    这里没有单一的最佳实践。这取决于什么 map

    一个数据点要特别考虑的操作普遍称为 地图 ,例如数组上的一个(和 filter slice ,等等):默认情况下,数组中的实现将返回 B (没有你的特殊工作)。但是,如果返回更有意义的话,实现可以覆盖默认行为 A

    使用数组默认行为的示例(在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

    重写数组默认行为的示例(同样,在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(即使用方法overwrite)。

    对的