C#中的继承和泛型有问题

时间:2011-11-10 16:13:06

标签: c# generics inheritance

我有一堂课,我这样说:

public class WhereOrCondition<T> : WhereCondition<T>

两个类的泛型类型T相同。我不确定如何正确声明我的类,以便在WhereOrCondition中也使用WhereCondition使用的Generic类型。

以这种方式声明我的课程会给我以下错误:

Error 1 The type 'T' cannot be used as type parameter 'T' in the generic type or method 'BrainStorm.WhereCondition<T>'. There is no boxing conversion or type parameter conversion from 'T' to 'BrainStorm.DatabaseObject'.

关于如何正确宣布我的课程的任何想法?

修改

WhereCondition类的声明如下:

public class WhereCondition<T> : IEnumerable<KeyValuePair<string, object>> where T : DatabaseObject 

3 个答案:

答案 0 :(得分:7)

您需要在WhereOrCondition<T>上放置相同的where条件,使其看起来像

public class WhereOrCondition<T> : WhereCondition<T> where T: DatabaseObject

规则是子类的where子句必须与基类的where子句相同或更严格。

这说WhereOrCondition<T>对于子类有WhereCondition<T>,而T必须是DatabaseObject(或子类)。

评论public class WhereAndCondition<T> where T: WhereCondition<T>中的代码完全不同。这表明T必须是WhereCondition<T>,这不可能是真的。

答案 1 :(得分:1)

为Ray的答案添加代码:

public class WhereOrCondition<T> : WhereCondition<T> where T : DatabaseObject { }

public class WhereCondition<T> : IEnumerable<KeyValuePair<string, object>> where T : DatabaseObject
{
    public IEnumerator<KeyValuePair<string, object>> GetEnumerator() { }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

public class DatabaseObject { }

答案 2 :(得分:1)

您没有足够的代码让任何人真正确定您要完成的任务。让我来说明一下。

如果你的意思是“当我创建一个派生类然后'cast'作为它的父类时,我希望T是相等的”,到目前为止您所拥有的代码似乎符合该度量。假设......

public class WhereCondition<T>
{
}

public class WhereOrCondition<T> : WhereCondition<T>
{
}

public class DatabaseObject
{
    public int Id { get; set; }
}

您现在可以使用父类和子类,并且在大多数情况下,可以使用您的内容。并且,内部对象将是相同的。

我能想到的唯一可能导致问题的是你是不是真的保持“通用”并且你在其中一个类中输入了T,通过添加“where T:objectType”。

我错过了什么吗?