在head first 设计模式中 用到了很多很多接口对象
首先澄清一个问题,就是接口不仅可以声明对象,而且可以把对象实例化,还可以当做参数被传入。
一、接口回调
这就是继承中的向上转型。父类 FL=new 子类();只不过这里的父类就是interface接口。(个人认为这里不管是class的override还是interface的重写,都是一样的用法)
可以把实现某一接口类创建的对象的引用赋给该接口声明的接口变量,那么该 接口变量就可以调用被类实现的接口中的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口方法
直接上代码
代码如下 | 复制代码 |
usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text;
namespaceConsoleApplication1 { interfaceItemp { doubleplus(); } publicclassnum : Itemp { doubleaa, bb; publicnum(doublea,doubleb) { this.bb = b; this.aa = a; } publicdoubleplus() { return(aa * bb); } } classProgram { staticvoidMain(string[] args) { num n =null;//声明类对象引用 Itemp tm =null;//声明接口对象引用 tm =newnum(1.1, 2.2);//接口回调(向上转型) Console.WriteLine(tm.plus()); Console.ReadKey(); } } } |
通过上面的例子,我们不难看出,接口对象的实例化实际上是一个接口对象作为一个引用,指向实现了它方法的那个类中的所有方法,这一点非常象C++中的函数指针(在C#中类似委托),但是却是有区别的。C#中的接口对象实例化实际上是一对多的,而C++中的函数指针是一对一的。
但是需要注意的是,接口对象的实例化必须用实现它的类来实例化,而不能用接口本身实例化。用接口本身实例化它自己的对象在C#中是不允许的。