网摘 |  收藏 | 

泛型接口

泛型接口指定实参

    public sealed class Point
    {
        public Int32 x;
        public Int32 y;

        public override string ToString()
        {
            return "x: " + x + " y: " + y;
        }
    }

    public class Triangle : IEnumerable<Point>
    {
        private Point[] m_triangle;
        public Triangle(Point[] pArray)
        {
            m_triangle = new Point[pArray.Length];

            for (Int32 i = 0; i < pArray.Length; i++)
            {
                m_triangle[i] = pArray[i];
            }
        }

        public IEnumerator<Point> GetEnumerator()
        {
            return new TriangleEnum(m_triangle);
        }

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

    public sealed class TriangleEnum : IEnumerator<Point>
    {
        private Point[] m_vertices;
        int position = -1;

        public TriangleEnum(Point[] list)
        {
            m_vertices = list;
        }

        public Boolean MoveNext()
        {
            position++;
            return position < m_vertices.Length;
        }

        public void Reset()
        {
            position = -1;
        }

        public Point Current
        {
            get
            {
                try
                {
                    return m_vertices[position];
                }
                catch (IndexOutOfRangeException)
                {
                    throw new InvalidOperationException();
                }
            }
        }

        Object IEnumerator.Current
        {
            get
            {
                return Current;
            }
        }

        public void Dispose()
        { }
    }

泛型接口未指定实参

    internal sealed class ArrayEnumerable<T> : IEnumerable<T>
    {
        private T[] m_array;
        public ArrayEnumerable(T[] list)
        {
            m_array = new T[list.Length];

            for (Int32 i = 0; i < list.Length; i++)
            {
                m_array[i] = list[i];
            }
        }

        public IEnumerator<T> GetEnumerator()
        {
            return new ArrayEnumerator<T>(m_array);
        }

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

    internal sealed class ArrayEnumerator<T> : IEnumerator<T>
    {
        private T[] m_array;
        private Int32 m_position = -1;

        public ArrayEnumerator(T[] list)
        {
            m_array = list;
        }

        public Boolean MoveNext()
        {
            m_position++;
            return m_position < m_array.Length;
        }

        public void Reset()
        {
            m_position = -1;
        }

        public T Current
        {
            get
            {
                try
                { 
                    return m_array[m_position];
                }
                catch (IndexOutOfRangeException)
                {
                    throw new InvalidOperationException();
                }
            }
        }

        Object IEnumerator.Current
        {
            get
            {
                return Current;
            }
        }

        public void Dispose()
        { }
    }

 

测试代码

    class GenericInterfaceNoAssign
    {
        public static void Go()
        {
            Point[] points = new Point[7]
            {
                new Point(){x=110, y=220},
                new Point(){x=111, y=221},
                new Point(){x=112, y=222},
                new Point(){x=113, y=223},
                new Point(){x=114, y=224},
                new Point(){x=115, y=225},
                new Point(){x=116, y=226}
            };

            ArrayEnumerable<Point> arrayEn = new ArrayEnumerable<Point>(points);

            foreach (Point p in arrayEn)
            {
                Console.WriteLine(p.ToString());
            }
        }
    }

    class GenericInterface
    {
        public static void Go()
        {
            Point[] points = new Point[3]
            {
                new Point(){x=10, y=20},
                new Point(){x=11, y=21},
                new Point(){x=12, y=22}
            };

            Triangle triangle = new Triangle(points);

            foreach (Point p in points)
            {
                Console.WriteLine(p.ToString());
            }
        }
    }

 

posted @ 2014-07-07 14:17  xulonghua219  阅读(247)  评论(0编辑  收藏  举报