我刚开始学习泛型,并使用它们来重构我的代码中相当复杂的部分(我只使用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
?或者我只是可怕地滥用语言,应该采取一种完全不同的方法?
嗯 - 我可能可以去接口路由...我会看看实际的代码,看看是否有任何地方会掉下来... – vitch 2009-12-07 15:44:22
但即使有*没有*在接口是独立于T的,你说的只是为了代码的意图和可读性的清晰性。即使它只是一个标记接口,编译器仍然会验证你不会做不可能的强制转换(即,你可以将一个'object'向下转换为'string',但是不能将'IJoinable'向下转换为'string' - 'string'不执行'IJoinable'。) – 2009-12-07 18:39:12
好点Eamon – philsquared 2009-12-07 21:59:18