我有一个抽象类:
public abstract class ParentClass<T, U> {
// a bunch of common code to prevent duplication in children
protected abstract adaptThese(...things: Array<MyType>): Array<T>
protected abstract adaptThose(...things: Array<MyType>): Array<U>
// some other non-generic abstract methods
}
这是一个示例子类:
public class ChildClass extends ParentClass<FirstType, SecondType> {
protected adaptThese(...things: Array<MyType>): Array<FirstType> {
//...
}
protected adaptThose(...things: Array<MyType>): Array<SecondType> {
//...
}
// implementations of the other abstract methods...
}
我的代码按原样工作,但问题是所有引用ParentClass
的代码都必须将其引用为ParentClass<any, any>
。由于泛型类型仅用于内部目的(仅protected
东西),我想知道是否存在一种从父类中删除泛型类型的好方法,同时仍为孩子使用{{1 }}和<T>
。
我最初引入这些泛型是为了强制子类提供从<U>
到MyType
和T
的某种适应,它们都是依赖于库的,并且从不{{1} }。目标是无论使用哪个底层库,都允许我项目的其余部分使用U
,因为它们的设计非常相似,但是可以接受不同的类型。这将允许在不影响此层次结构之外的代码的情况下交换所选的包。 (我使用的是Angular,因此这意味着只需在一行上更改提供程序的MyType
。
我试图制作一种可能包含泛型的内部适配器对象,但是我不知道该如何强制子类声明和实现类似于上面的方法。
我得到的最接近的结果是在MyType
的{{1}}类型的构造函数中添加一个参数,但是我无法使useClass
成为一些通用类型,强制儿童使用类型安全。
一条可能真正有用的信息是ParentClass
从不引用泛型方法本身,因此不一定必须声明它们才能供MyAdapter<any, any>
使用。他们只是在强迫孩子实施他们。也许我可以使用某种界面设计来做到这一点?
简而言之:如果有条件的话,我怎么能强迫孩子实施类型安全的方法,而无需在父签名中声明类型呢?
请求了一个示例,因此这是一个简化示例,说明如何拆分类型依赖项:
在any
中,我可能有这样的方法:
ParentClass
在子班中:
ParentClass
有许多类似上述方法的工具或从库服务中请求状态,这些方法需要两种类型之一。
每个库的代码都非常相似,因此为什么我为面向项目的代码引入了一个父类,并让子类使用与库相关的细节。
此后我要考虑的另一个问题是,我可能能够制作一个面向项目的服务类,然后为该类提供通用类型的库集成服务,但这是相当可重写的,我仍然对此感兴趣这个问题的答案。
答案 0 :(得分:2)
处理此问题的最佳方法可能是制作一个{em>不是通用的接口IParentClass
,然后在以前引用{{1 }}。
IParentClass
或者,您可以提供ParentClass<any, any>
作为interface IParentClass {
// all the public methods from ParentClass
}
abstract class ParentClass<T, U> implements IParentClass {
// same as before
}
// reference like this
var foo: IParentClass;
上泛型类型参数的默认值,但这不是理想的选择,因为无法强制子类为通用。例如(我引入了一些新的方法签名来使问题更明显):
any