我刚刚开始掌握泛型,并且我(ab)使用它们来重构我的代码中相当复杂的部分(我只使用了一段时间的c#但是在其他语言中相当有经验)。
我有一个继承结构,我的类扩展了一个基类。在基类中,我实现了大部分功能。但是我希望能够将这些子类与其兄弟姐妹的实例联系起来。
以下是一些相关代码的简化:
class ParentClass<T>
where T : ParentClass<T>, new()
{
public static T Create()
{
return new T();
}
private object joinedItem;
public void Join<TJoinee>(TJoinee item)
where TJoinee : ParentClass<TJoinee>, new()
{
joinedItem = item;
}
}
class ChildOne : ParentClass<ChildOne>
{
}
class ChildTwo : ParentClass<ChildTwo>
{
}
使用此代码,我可以执行以下操作:
var a = ChildOne.Create();
a.Join(new ChildTwo());
问题是我需要输入joinedItem
作为对象,因为我真的要将其键入ParentClass<Something>
。是否可以为joinedItem
规定更具体的类型?或者我只是非常滥用语言,应采取完全不同的方法?
答案 0 :(得分:3)
您是否可以从ParentClass<T>
中提取不依赖于T
的界面?那样joinedItem
可以输入到界面。
这似乎就是你可以尝试做的事情(将ParentClass<T>
个实例加入ParentClass<U>
个实例)。
如果ParentClass<T>
接口中没有任何内容不依赖于T
,那么在不知道T
的情况下很难找到比对象更有用的接口。
答案 1 :(得分:1)
这里的核心问题是,无法表达变量必须是XYZ<_>
类型的概念 - 具有任意类型参数。
你可以在参数中表达它,那么你只需要添加约束(就像你一样),但你不能那样去变量(至少,不是没有将变量类型添加到列表中)类型参数,可能在语法上很难看。)
因此,如果您需要为任何类型XYZ<_>
表达_
的概念,您需要将该概念明确表示为类型(例如IXYZ
),并确保所有XYZ<_> : IXYZ
实际上是从那里继承的。通常,最灵活的方法是通过接口,但抽象基类也可以。
不幸的是,类型类通常不是泛型的一部分; - )。