ООП: метод, возвращающий новый экземпляр, что должен вернуть потомок? - PullRequest
0 голосов
/ 13 ноября 2018

Я использую машинопись.У меня есть класс с методом, который возвращает новый экземпляр класса.

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

И я подкласс A.

class B extends A {
}

Мой вопрос: есть ли лучшая практикав ООП, который говорит, что функция map в B должна возвращать B?Или это только выбор разработчика для возврата A или B (то есть с перезаписью метода).

1 Ответ

0 голосов
/ 13 ноября 2018

Здесь нет единой лучшей практики.Это зависит от того, что map делает, и семантики, которую вы хотите, чтобы она имела.

Одна точка данных, которую следует учитывать конкретно в отношении операции, обычно называемой 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 (т. е. с перезаписью метода).

Исправить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...