• 【读】构建可枚举类型(IEnumerator和IEnumerable)


    转自:http://www.cnblogs.com/tnspop/archive/2012/03/15/2397666.html

     //构建可枚举类型(IEnumerable和IEnumerator),让自定义类型支持类似foreach的枚举

     
    //这个接口告诉调用方对象的子项可以枚举
    //public interface IEnumerable
    //{
    //    IEnumerator GetNumerator();
    //}
    //可以看到,GetEnumerator()方法返回另一个接口System.Collections.IEnumerator的引用。这个接口提供了基础设施,
    //调用方法可以用来移动IEnumerable兼容器包含的内部对象:
    //这个接口允许调用方获取一个容器的子项
    //public interface IEnumerator
    //{
    //    bool MoveNext();    //将光标的内部位置向前移动
    //    object Current {get;}//获取当前的项(只读属性)
    //    void Reset();//将光标重置到第一个成员前面
    //}
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Collections;
     
    namespace Garage
    {
        public class Car
        {
            private string name;
            private double speed;
     
            public Car()
            {
                name = "null";
                speed = 0;
            }
     
            public Car(string name, double speed)
            {
                this.name = name;
                this.speed = speed;
            }
     
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
            public double Speed
            {
                get { return speed; }
            }
        }
     
        public class Garage:IEnumerable
        {
            private Car[] carArray;
            
            public Garage()
            {
                carArray = new Car[4];
                carArray[0] = new Car("Rusty", 50);
                carArray[1] = new Car("Clunker", 55);
                carArray[2] = new Car("Zippy", 30);
                carArray[3] = new Car("Fred", 30);
            }
     
            /// <summary>
            /// 这是一个接口的显示实现
            /// </summary>
            /// <returns></returns>
            IEnumerator IEnumerable.GetEnumerator()
            {
                //因为System.Array类型已经实现了IEnumerator和IEnumerable的接口,可以简单委托请求到System.Array
                //返回数组对象的Enumerator.
                return carArray.GetEnumerator();
            }
     
            /// <summary>
            /// 这是一个接口在对象级别的调用
            /// </summary>
            /// <returns></returns>
            //public IEnumerator GetEnumerator()
            //{
            //    return carArray.GetEnumerator();
            //}
     
        }
        class Program
        {
            static void Main(string[] args)
            {
                Garage carLot = new Garage();
     
                foreach (Car c in carLot)
                {
                    Console.WriteLine("{0} is going {1} MPH", c.Name, c.Speed);
                }
     
     
                //这是在对象级别的引用
                //因为GetEnumerator()被定义为公开的,所以,可以在对象级别进行引用
                //可以手动和IEnumerator协作
                //IEnumerator i = carLot.GetEnumerator();
                //i.MoveNext();
                //Car myCar = (Car)i.Current;
                //Console.WriteLine("{0} is going {1} MPH", myCar.Name, myCar.Speed);
                //如果想要在对象级隐藏IEnumerator接口,简单使用显示接口实现就行了
            }
        }
    }
  • 相关阅读:
    SpringXML方式配置bean的懒加载lazy-init
    jQuery实现select三级联动
    jQuery实现导航栏
    jQuery实现点击式选项卡
    jQuery对象和dom对象
    jQuery插件
    Failed to execute goal org.apache.tomcat.maven:tomcat7-maven-plugin:2.2:deploy (default-cli) on project Resource: Cannot invoke Tomcat manager: Connection refused: connect -> [Help 1]
    Java、Apache Tomcat下载与安装及环境变量配置
    Notepad++怎么增加整行删除快捷键?添加/取消区块注释?
    org.apache.catalina.core.DefaultInstanceManager cannot be cast to org.apache.tomcat.InstanceManager
  • 原文地址:https://www.cnblogs.com/chenyongblog/p/3116049.html
Copyright © 2020-2023  润新知