键入包含受约束泛型类实例的变量

时间:2009-12-07 15:23:02

标签: c# generics inheritance syntax

我刚刚开始掌握泛型,并且我(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规定更具体的类型?或者我只是非常滥用语言,应采取完全不同的方法?

2 个答案:

答案 0 :(得分:3)

您是否可以从ParentClass<T>中提取不依赖于T的界面?那样joinedItem可以输入到界面。

这似乎就是你可以尝试做的事情(将ParentClass<T>个实例加入ParentClass<U>个实例)。

如果ParentClass<T>接口中没有任何内容不依赖于T,那么在不知道T的情况下很难找到比对象更有用的接口。

答案 1 :(得分:1)

这里的核心问题是,无法表达变量必须是XYZ<_>类型的概念 - 具有任意类型参数。

可以在参数中表达它,那么你只需要添加约束(就像你一样),但你不能那样去变量(至少,不是没有将变量类型添加到列表中)类型参数,可能在语法上很难看。)

因此,如果您需要为任何类型XYZ<_>表达_的概念,您需要将该概念明确表示为类型(例如IXYZ),并确保所有XYZ<_> : IXYZ实际上是从那里继承的。通常,最灵活的方法是通过接口,但抽象基类也可以。

不幸的是,类型类通常不是泛型的一部分; - )。