一说到面向对象我们马上会想到封闭,继承,多态.而封装性的具体体现最容易想到的是属性,把字段设成private,然后弄一个public的属性,使用get,set去访问,赋值.
其实比较令人费解的索引器也跟属性一样是体现封装性.
class IndexTest
{
//private int num;
//public int Num
//{get;set;}
private int[] array = new int[3];
public int this[int index]
{
get
{
if (index < 0 || index > 2)
return 0;
else
return array[index];
}
set
{
if (index >= 0 && index < 3)
array[index] = value;
}
}
}
class Program
{
static void Main(string[] args)
{
IndexTest test = new IndexTest();
for (int i = 0; i < 3; i++)
test[i] = i;
Console.WriteLine(test[1]);
}
}
刚一看索引器的用法总觉得怪怪的,其实说到底它的用处跟属性完全一样的.只是属性不能把数组下标当参数传进去.没办法才整出个this[int index]这样怪怪的写法.其实我们如果把this改成ArrayTest[int index]这样就较容易理解点.
不过我们发现用this的话有个局限性,假如里面还有个数组private int eno[] = new int[3];那咋整?自然不能再用this[int index]了.如果实在要碰到这种情况只能采取些变态点的方法了啊.比如用this[string index],然后index取值one,two,three之类的,再用switch一下,判断这些字符串,再取对应的eno[0],eno[1]...或者更变态点,在this[int index]中如果index是0,1,2则代表num,是3,4,5代表eno.但如果多几个数组咋整?真不知道咋整.也不知道为啥不设计成我刚说的ArrayTest[int index]这种样子,这样就跟属性完全一样,只不过多了个参数.
不过其实不管是属性还好,索引器还好,你未必一定要弄个private的字段,然后封装下.其实你直接整成个public int num,public int[] array的也不是不行.只是没有了封装性的一些好处,比如做些判断处理之类的.
其实事件(event)也有点像是对代理(delegate)的封装,只不过它显得更加复杂点.