一、
接口不能实例化,用接口的实现类可以实例化,将实现类的对象在内存中的地址指向接口,这个接口就可以使用了
二、
实现接口的类 实例 = new 实现接口的类()// 这样用不好吗? //这样已经不是好不好的问题了,这样的话,要接口有什么用? //用接口就是让实例和实现类的耦合度降低。 //让程序更加容扩展。 以下是问题之外的知识,想看可以往下,不想看跳过。 接口 实例 = new 实现接口的类A() 接口 实例 = new 实现接口的类B() 接口 实例 = new 实现接口的类C() 这样的逻辑就是说,我们需要某个类,所以我们每次实例化它。 如果把 ABC这三个类,再用一个类封D装起来,会怎么样呢? 接口 实例 = D.A 接口 实例 = D.B 接口 实例 = D.C 我们还是需要某个类,但是,我们不需要每次都实例化了,只需要找D“拿”就行。
嗯,这就是工厂模式的来由!!!!
C# 实例化接口对象的方法
在head first 设计模式中 用到了很多很多接口对象
首先澄清一个问题,就是接口不仅可以声明对象,而且可以把对象实例化,还可以当做参数被传入。
一、接口回调
这就是继承中的向上转型。父类 FL=new 子类();只不过这里的父类就是interface接口。(个人认为这里不管是class的override还是interface的重写,都是一样的用法)
可以把实现某一接口类创建的对象的引用赋给该接口声明的接口变量,那么该 接口变量就可以调用被类实现的接口中的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口方法
直接上代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
interface Itemp
{
double plus();
}
public class num : Itemp
{
double aa, bb;
public num( double a, double b)
{
this .bb = b;
this .aa = a;
}
public double plus()
{
return (aa * bb);
}
}
class Program
{
static void Main( string [] args)
{
num n = null ; //声明类对象引用
Itemp tm = null ; //声明接口对象引用
tm = new num(1.1, 2.2); //接口回调(向上转型)
Console.WriteLine(tm.plus());
Console.ReadKey();
}
}
}
通过上面的例子,我们不难看出,接口对象的实例化实际上是一个接口对象作为一个引用,指向实现了它方法的那个类中的所有方法,这一点非常象C++中的函数指针(在C#中类似委托),但是却是有区别的。C#中的接口对象实例化实际上是一对多的,而C++中的函数指针是一对一的。
但是需要注意的是,接口对象的实例化必须用实现它的类来实例化,而不能用接口本身实例化。用接口本身实例化它自己的对象在C#中是不允许的。