如何使用多态来隐藏界面的属性?

时间:2019-06-06 15:14:02

标签: typescript linq polymorphism

作为学校项目的一部分,我正在Typescript中构建此类型安全的LINQ问题。整个项目的描述可以在这里找到:https://github.com/hogeschool/Software-Engineering-Minor/blob/master/Projects/project2%20-%20mini%20typesafe%20LINQ%20to%20SQL.md

作为项目的一部分,运营商的顺序很重要。就我而言,Select运算符应该是唯一可能执行的操作。首次选择之后,其他运算符将变为可见:IncludeWhereOrderByGroupBy

因此,在没有选择任何内容的情况下,您将不能进行分组,过滤或排序。

我想将代码分成几部分,我必须连接一个名为Table的接口,该接口包含执行操作符的数据和LazyTable,该数据仅包含要连接的函数链程序后面的体育场中的数据。

但是当涉及到{{1}上的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() 之前是不可能的。

1 个答案:

答案 0 :(得分:1)

使您的Select返回一个不同的接口,该接口包含其他方法,并且不要将它们包含在原始的Table接口中。我认为这是唯一合理的方法。

您实际上的意思不是在呼叫table.Where之前禁止呼叫table.Select,而是完全禁止呼叫table.Where。可以调用Where的唯一对象是调用table.Select的结果,对吗?因此,请使其成为不同的界面。