Точное использование Абстрактного класса

Я думаю, что изучение функционального программирования поможет вам здесь.

Я использовал функцию pipe из интернет-ссылки ниже, но вы можете использовать lodash / Ramda / underscore или любую другую вашу любимую библиотеку util.

две основные концепции, которые я здесь использую, - это карри и пайпинг.

Что такое «каррирование»? Карринг - это когда вы разбиваете функцию, которая принимает несколько аргументов, на ряд функций, которые принимают часть аргументов, мы также используем карринг, который возвращение функции из другой функции для создания новых функций.

https://medium.com/@venomnert/pipe-function-in-javascript-8a22097a538e Функция конвейера принимает n последовательностей операций; в которой каждая операция принимает аргумент; обработать это; и выдает обработанный вывод в качестве ввода для следующей операции в последовательности. Результатом конвейерной функции является функция, представляющая собой объединенную версию последовательности операций.

blockquote>

здесь мы берем массив, создаем новый массив функций, которые мы хотим применить к значению.

Итак, мы хотим выполнить загрузку объединений в БД.

join => con => con.innerJoin(join);

принимает значение, то есть «table1» и возвращает функцию, которая принимает соединение БД, которое вызывает соединение и возвращает следующее.

const joins = toJoin.map(join => con => con.innerJoin(join)); и это создает массив функций для передачи в канал.

const db = ({
  select: function (field) {
    console.log('select', field)
    return db
  },
  from: function (table) {
    console.log('from', table)
    return db;
  },
  innerJoin: function (join) {
    console.log('innerJoin', join)
    return db;
  }
});

const _pipe = (a, b) => (arg) => b(a(arg));
const pipe = (args) => [].slice.apply(args).reduce(_pipe);

function joinInnerMultiple(table, fields, toJoin) {
  const joins = toJoin.map(join => con => con.innerJoin(join));

  return pipe(joins)(db.select(fields).from(table)); 
}


joinInnerMultiple("User", "uuid", ["table1", "table2", "table3", "table4", "table5"])

18
задан 1800 INFORMATION 27 October 2008 в 07:17
поделиться

4 ответа

Используйте абстрактный класс, чтобы обеспечить некоторую конкретную реализацию, но не позволить инстанцирование. Можно всегда инстанцировать обычного класса, который не имеет смысла, если он не может выдержать один. В то же время интерфейс не мог бы быть достаточно, если существует конкретная реализация, это идентично во всех классах с реализацией. Абстрактный класс как раз.

  • Интерфейс: заключите контракт только, никакая реализация, никакое инстанцирование
  • Абстрактный класс: контракт, некоторая реализация, никакое инстанцирование
  • Класс: контракт, реализация, инстанцирование
24
ответ дан 30 November 2019 в 06:29
поделиться

Абстрактный класс используется, когда у Вас есть некоторая базовая функциональность, которую Вы хотите, чтобы подклассы наследовали, но не имело бы смысла инстанцировать базового класса. Например, если бы у Вас было что-то как базовый класс Формы, то у Вас могли бы быть некоторые созданные в реализации, которая могла использоваться подклассами, а также методами интерфейса, которые Вы хотите, чтобы подклассы реализовали. Однако, вероятно, не имело бы смысла создавать Объект фигуры. Абстрактный класс дает Вам эту функциональность. Другой яркий пример использования абстрактного класса шаблон "абстрактная фабрика" .

19
ответ дан 30 November 2019 в 06:29
поделиться

Регулярные классы требуют, чтобы Вы обеспечили реализации для всех методов.
Интерфейсы требуют, чтобы Вы к не обеспечили любые реализации для всех методов.

Абстрактные классы являются единственным типом класса, которые позволяют Вам и иметь методы, которые действительно содержат реализацию и имеют методы, которые не обеспечивают реализацию, но требуют, чтобы наследующий класс обеспечил ту.

то, что Вам разрешают добавить методы без реализации, является причиной, Вы не можете инстанцировать абстрактного класса: можно только инстанцировать чего-то, что имеет реализации для всех его методов.

5
ответ дан 30 November 2019 в 06:29
поделиться

В отличие от регулярных классов, abstract классы могут содержать abstract методы. Они действуют во многом как интерфейсные участники.

Между тем, они могут сделать примерно все остальное, что могут сделать регулярные классы: они могут реализовать методы, содержать поля & вложенные типы, произойдите из другого класса, и т.д.

1
ответ дан 30 November 2019 в 06:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: