VS有一个解决方案的概念,这样诸多的工程可以放在同一个解决方案之中,方便管理,因为初学C#,本来以为只要我将学习的代码放到解决方案中就可以了,但是,随着代码量的增加,之前的例子还是石沉大海,也没很多机会再回头看看,所以,就把一些很有意思的代码贴到博客里面,强制自己分析一遍,加深理解和印象,也保留了学习的足迹。--2013.12.15.
之前理解了接口的运行机制,但是泛型接口一度让我有点糊涂,今天看到C# In Depth里面展示了一个小例子,就是说接口以及foreach的,看完这个例子,发现还是挺有意思的:
1 对于扩展接口的实现,访问限制符号是没有意义的
2 泛型接口扩展了接口,实际使用时,其实是一种限制
3 IEnumerable是对于IEnumerator的封装,并且两者的泛型申明都是对基本接口的扩展。
IEnumerable<T>的实现:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//IEnumberator只隶属于Collections这一级
using System.Collections;
namespace GenericTest20131211
{
class NewContinuingEnumber
{
//class NewContinuingEnumberBase : IDisposable
//{
// public void Dispose()
// { }
//}
class EnumberableImpl :IEnumerable<int>, IDisposable
{
//Implement IEnumerator<T> GetEnumerator(),实际上IEnumerable<T>是
//IEnumerator<T>的一个wrapper,先实现IEnumerator<T>,既然是封装类
//IEnumerator<T> GetEnumerator() 只能从对象中获取接口了
public IEnumerator<int> GetEnumerator()
{
return (new EnumeratorImpl()) as IEnumerator<int>;
}
//接下来尝试实现IEnumerator.IEnumerator GetEnumerator(),由于IEnumerable<T>只是对
//IEnumerable的扩展和类型限制,所以,其实返回一个IEnumerator<int>转化为IEnumerator即可
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator() as IEnumerator;
}
public void Dispose() { }
}
IEnumerator的实现:
class EnumeratorImpl : IEnumerator<int>
{
int current = -1;
//IDisposable.Dispose;
public void Dispose() { }
//实现属性的访问方法
public int Current { get { return current; } }
//再显式的实现IEnumerator的接口,泛型和非凡性的奇怪组合,泛型虽然是一个开放类型
//但是指定了类型,相对于单纯的接口来说,泛型的最终使用是一种限制
//IEnumerator的属性实现,object Current,但是需要指明接口
object IEnumerator.Current { get { return Current; } }
public bool MoveNext()
{
current++;
return current < 10;
}
public void Reset()
{
current = -1;
}
}
测试程序:
class TestEnumImpl
{
public static void Test()
{
//这个测试说明了foreach的工作原理,获取一个IEnumerable接口,然后遍历其中的对象
//获取一个结合的包装对象,然后就可以通过foreach遍历了
using (EnumberableImpl enumer = new EnumberableImpl())
{
IEnumerable<int> enumerable = enumer as IEnumerable<int>;
{
foreach (int num in enumerable)
{
Console.WriteLine(num.ToString());
}
}
}
}
}