Как использовать полиморфизм, чтобы скрыть свойства интерфейса? - PullRequest
0 голосов
/ 06 июня 2019

Я создаю эту проблему Безопасного типа LINQ в Typescript как часть школьного проекта.Полное описание проекта можно найти здесь: https://github.com/hogeschool/Software-Engineering-Minor/blob/master/Projects/project2%20-%20mini%20typesafe%20LINQ%20to%20SQL.md

В рамках проекта существует ограничение, определяющее порядок операторов.В моем случае оператор Select должен быть единственной возможной и первой выполняемой операцией.После первого выбора становятся видны другие операторы: Include, Where, OrderBy и GroupBy.

Таким образом, вы не сможете группировать, фильтровать или сортировать, когда ничего не выбрано.

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

Но я сталкиваюсь с некоторыми проблемами, когда дело касается зависимости от LazyTable до Table, потому что LazyTable просто использует операции Table.

interface Table<T, U> {
    data: Data<T, U>
    Select: () => Table
    Include: () => Table
    Where: () => Table
    OrderBy: () => Table
    GroupBy: () => Table
    toList: () => List
}

interface LazyTable<T, U> {
    query: Query<T1, U1, T2, U2>
    Select: () => LazyTable
    Include: () => LazyTable
    Where: () => LazyTable
    OrderBy: () => LazyTable
    GroupBy: () => LazyTable
    apply: (data) => Table 
}

В настоящее время я могу инициализировать экземпляр Table или LazyTable и вызывать их методы:

users.Select("name", "email", "age").Include("Products", q => q.Select("price", "name", "quantity").Where("price", GreaterThan(100))).OrderBy("age", "DESC")

Я хочу, чтобы это происходило таким образомчто звонить:

users.Where()
users.Include()
users.OrderBy()
users.GroupBy()

невозможно до звонка Select.

1 Ответ

1 голос
/ 06 июня 2019

Сделайте так, чтобы ваш Select возвращал другой интерфейс, который содержит дополнительные методы, и не включайте их в оригинальный интерфейс Table. Вот думаю, единственно разумный подход.

То, что вы на самом деле имеете в виду, это не запретить вызов table.Where перед вызовом table.Select, а просто запретить вызов table.Where в целом. Единственный объект, для которого вы можете вызвать Where - это результат вызова table.Select, верно? Так что сделайте это другим интерфейсом.

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