我怎样才能从ArrayList <myclass>?</myclass>继承

时间:2010-09-03 05:46:45

标签: c# inheritance collections

我想继承某种数组/向量/列表类,这样我就可以只添加一个额外的专用方法......就像这样:

public class SpacesArray : ArrayList<Space>
{
    public Space this[Color c, int i]
    {
        get
        {
            return this[c == Color.White ? i : this.Count - i - 1];
        }
        set
        {
            this[c == Color.White ? i : this.Count - i - 1] = value;
        }
    }
}

但编译器不会让我。说

  

非泛型类型'System.Collections.ArrayList'不能与类型参数一起使用

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:11)

ArrayList不是通用的。使用System.Collections.Generic中的List<Space>

答案 1 :(得分:2)

没有ArrayList<T>List<T>效果相当好。

public class SpacesArray : List<Space>
{
    public Space this[Color c, int i]
    {
        get
        {
            return this[c == Color.White ? i : this.Count - i - 1];
        }
        set
        {
            this[c == Color.White ? i : this.Count - i - 1] = value;
        }
    }
}

答案 2 :(得分:2)

您可以围绕ArrayList<T>创建一个包装器,它实现IReadOnlyList<T>。类似的东西:

public class FooImmutableArray<T> : IReadOnlyList<T> {
    private readonly T[] Structure;

    public static FooImmutableArray<T> Create(params T[] elements) {
        return new FooImmutableArray<T>(elements);
    }

    public static FooImmutableArray<T> Create(IEnumerable<T> elements) {
        return new FooImmutableArray<T>(elements);
    }

    public FooImmutableArray() {
        this.Structure = new T[0];
    }

    private FooImmutableArray(params T[] elements) {
        this.Structure = elements.ToArray();
    }

    private FooImmutableArray(IEnumerable<T> elements) {
        this.Structure = elements.ToArray();
    }

    public T this[int index] {
        get { return this.Structure[index]; }
    }

    public IEnumerator<T> GetEnumerator() {
        return this.Structure.AsEnumerable().GetEnumerator();
    }

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

    public int Count { get { return this.Structure.Length; } }

    public int Length { get { return this.Structure.Length; } }
}