1、首先,IFormatProvider是一个“接口”。关于接口的特性(“抽象”性、不能写具体的可执行代码,只规定名称和参数、具体实现由继承的类负责……),网上有一个精辟的例子{引自【1】},笔者贴在下面了。接口不提供方法的具体视线,方法的具体实现是写在继承接口的函数中的。不过,只要我们知道某个类是继承了某个接口,那么我们就可以确定这个类满足某种(由接口规定的)“约定”——比如说存在某种方法。总体说来,这句话总结得很精辟:“接口本质上是类与类之间的一种约定”。
2、下面的这个例子{(1)至(2)}{引自【1】}指出:如果不使用接口,在clsProject类使用不同Programmer类的同名函数的时候要反复重载。(1)对于Programer类来说,同样都是每个类里要实现一个“WriteCode()”函数,只是如果用接口的话接口相当于强制规定类中必须有一个“WriteCode()”函数
3、(2)对于Project类来说,则完全不同了!使用了接口以后,就可以直接把接口(IProgrammer)的对象作为参数传给WriteProgram函数,再也不用重载那么多次了!同样,在main()函数中只要知道了某个类有IProgrammer接口,创建一个接口,然后“接口=new 类名”,这个接口直接作为参数传输。顿时感觉C++里的重载弱爆了有木有!
4、IFormatProvider也是c#的一个接口。首咸犴孜稍先来看官方提供的IFormatProvider的文档{引自【2】},官方对IFormatPro即枢潋雳vider的解释是“Provides a mechanism for retrieving(vt.取回; 恢复; [计] 检索; 重新得到) an object to control formatting.”粗略地理解,ICustomFormatter相当于“我这个类只能提供类型为ICustomFormatter的对象"”;而IFormatProvider负责提供类型为ICustomFormatter的具体的格式信息。
5、IFormatProvider作为一个接口,只有一个GetFormat函数。那么,这个函数是干什么用的呢?这个函数规定了继承这个接口的类里的GetFormat函数的输入和输出——输入一个Type,输出是一个对象object。
6、函数的输出object是一个对象,函数的输入“Type”是这个对象的类型。综上所述,可以知道:对于类来说,继承了IFormatProvider接口相当于规定类中要有一个GetFormat()函数,同时规定了这个函数接受一个Type对象,返回一个(Type类型的)对象。
7、对于函数来说,如果输入的参数有IFormatProvider接口,则这个位置可以输入任何继承了IFormatProvider接口的类的对象。以StringBuilder.AppendFormat(IFormatProvider, String, Object)方法为例,可以看到这个函数的第一个参数是IFormatProvider,下面看一下函数实际使用的实例,其中enGB是英语 Great Britain的格式设置约定。
8、笔者找到了一个对IFormatProvider继承之后具体实现的例子{引自【3】},贴在下面,也让大家看看I僻棍募暖FormatProvider到底是什么样子的。在这个例子中,因为MyFormater类继承了ICustomFormatter接口和IFormatProvider接口,所以要写一个GetFormat函数。ICustomFormatter限制了这个类提供对象的类型;而GetFormat的意思就是——(对于一个对象来说)如果输入的类型是我的类型(ICustomFormatter),那就把我给你。