泛型和继承 - 方法args

时间:2014-03-04 12:13:02

标签: c# generics inheritance

我用方法Add:

编写了数据结构LinkedList
public class LinkedList<T>
    {
        private Element<T> first;
        private Element<T> last;

        public bool Add(Element<T> element)
        { 
        ...

我也定义了三个类:

public class Element<T> : IDisposable
public class ElementString : Element<string>, ICloneable    
public class ElementLong : Element<long>, ICloneable

当我想在main方法中做这样的事情时:

LinkedList<ElementLong> test = new LinkedList<ElementLong>();
ElementLong elem1 = new ElementLong();
test.Add(elem1);

我得到方法添加“有一些无效参数”的错误。 如何解决这个问题?谢谢你的帮助。

4 个答案:

答案 0 :(得分:4)

写作时

LinkedList<ElementLong>

您将T定义为ElementLongAdd方法需要Element<T>,在本例中为

Element<ElementLong>

如果您希望列表仅允许long,则可以使用:

LinkedList<long> test = new LinkedList<long>();
ElementLong elem1 = new ElementLong();
test.Add(elem1);

此外,可能不需要元素派生类,您可以直接使用基类:

var test = new LinkedList<long>();
var elem1 = new Element<long>();
test.Add(elem1);

答案 1 :(得分:1)

您应该将链表的泛型类型参数保留为实际类型:

LinkedList<long> test = new LinkedList<long>();

ElementLong elem1 = new ElementLong();
test.Add(elem1);

由于ElementLong实际上是Element<long>,因此可以使用。

如果您仍然可以获得LinkedList<ElementLong> Element<ElementLong>作为参数,那么这就是

答案 2 :(得分:0)

就这个界面而言:

LinkedList<ElementLong> test = new LinkedList<ElementLong>();

可能与此相同:

LinkedList<Element<long>> test = new LinkedList<Element<long>>();

类型参数T等于Element<long>>。这意味着您的add方法实际上有一个签名:

public bool Add(Element<Element<long>> element)

但您提供的参数类型为Element<long>,而不是Element<Element<long>>。 您应该声明列表的泛型类型T等于long,这是列表中要保留的元素类型。

我怀疑Element类是否应该是可访问的(公共)。

答案 3 :(得分:0)

其他人提到您的问题是您的通用类型为ElementLong,因此Add方法需要Element<ElementLong>的值。但我还要说,您应该考虑更改Add方法的签名,使其值为T

public class LinkedList<T>
{
    private Element<T> first;
    private Element<T> last;

    public bool Add(T value)
    { 
    ...

LinkedList<long> test = new LinkedList<long>();
test.Add(0);

这更符合其他通用集合的工作原理。您也可以考虑实施IList<T>接口。