zoukankan      html  css  js  c++  java
  • 类的索引器<索引器可以像方法一样重载>(一步步集合案例分析)

    案例3:<案例分析>

    namespace _2011._12._19
    {
    class Program
    {
    static void Main(string[] args)
    {
    Box box = new Box(10, 20, 30);
    Display(box[0],box[1],box[2]);
    Console.WriteLine(box["High"]);
    box[1] = 100;//set Width is 100
    Display(box[0], box[1], box[2]);
    box["high"] = 500;
    Display(box[0], box[1], box[2]);
    Console.WriteLine(box["High"]);

    }

    static void Display<T>(params T[] array)//泛型接口方法
    {
    for (var i = 0; i < array.Length;i++ )
    {
    Console.WriteLine("box[{0}] is :{1}",i,array[i]);
    }
    }

    }

    class Box

    {
    public Box(double length, double width, double high)//构造函数
    {
    double_num[0] = length;
    double_num[1] = width;
    double_num[2] = high;
    }
    private string[] names = { "length","width","high"};//一个对象被建立,是先初始化类的对象(实例),然后再到构造函数

    private double[] double_num = new double[3];

    public double this[int index]
    {
    set
    {
    if (index >= 0 && (index < double_num.Length))
    {
    double_num[index] = value;
    }

    }

    get
    {
    if (index < 0 || (index >= double_num.Length))
    {
    return -1;
    }
    else
    {
    return double_num[index];
    }
    }
    }

    public double this[string name]
    {
    get
    {
    int i = 0;
    while((i<names.Length)&&(name.ToLower() !=names[i]))
    {
    ++i;
    }

    return (i==names.Length)? -1:double_num[i];
    }

    set
    {
    int i = 0;
    while ((i < names.Length) && (name.ToLower() != names[i]))
    {
    ++i;
    }
    if (i != names.Length)
    {
    double_num[i] = value;
    }
    }
    }
    }
    }




    /*
    The Result:
    box[0] is :10
    box[1] is :20
    box[2] is :30
    30
    box[0] is :10
    box[1] is :100
    box[2] is :30
    box[0] is :10
    box[1] is :100
    box[2] is :500
    500
    */


    1.程序进入Main函数入口
    2.声明Box类的变量,新建对象,让变量指向该对象的内存地址
    3.注意:这个时候是进入类里,先初始化类里的变量,也就是初始化实例(对象) 注意:private int i ;这里只是声明一个变量,没有初始化,所以不会给他初始化,这里
    的数组为什么初始化了,因为:

    private string[] names = { "length","width","high"};//一个对象被建立,是先初始化实例,然后再到构造函数
    private double[] double_num = new double[3];



    4.第四步才是运行构造函数,给类的变量成员赋值
    5.调用了Display方法,这个时候不是直接去把参数传递方法,而是先去类里的Get属性,先做判断,合法的读取才能传递给方法(有几个变量就要判断几次)
    6.然后再调用方法的运行过程,完成一系列的动作
    7.Console.WriteLine(box["High"]);这个是调用Console类的方法,同理,也是先去类里Get属性判断是否合法,根据索引器里的索引号是什么属性,如果是字符串类型,那么就交给对应的索引器
    8.细说下代码:
               

    get
    {
    int i = 0;
    while((i<names.Length)&&(name.ToLower() !=names[i]))
    {
    ++i;
    }

    return (i==names.Length)? -1:double_num[i];
    }



    :i<names.Length-true,如果name.ToLower()==names[i],那么while循环将不执行
    :如果while循环为true,那么i自增,然后直到找到与name.ToLower()对应的names[i]
    :return 下面用于判断了下结果,当结果i=3的时候,因为索引号是0-2,那么当等于3的时候,说明,没有包含这个name.ToLower(),所以返回一个-1.
    9.然后WriteLine方法输出结果
    10.box[1]=100;这是给类的box变量对应的对象赋值,那么就要到set属性里去判断,这里是索引号的号码类型是整型,那么就会去对应的索引器去set.
    11.下面同理

  • 相关阅读:
    dfs 与 剪枝
    杭电OJ1789、南阳OJ236(贪心法)解题报告
    多边形面积问题(hdoj2036)
    retain copy(浅复制) mutablecopy (深复制)
    IOS开发的目录结构
    UITableView 委托方法总结
    ios block
    UITableView 学习笔记
    iso socket基础2
    ios socket(基础demo)
  • 原文地址:https://www.cnblogs.com/IAmBetter/p/2293293.html
Copyright © 2011-2022 走看看