日期:2014-05-18  浏览次数:20996 次

程序中的接口怎么理解啊?能不能给我个通俗易懂的例子啊?
RT

------解决方案--------------------
这么多人回答,连一个好一点,形象一点的合理的解释都没有!!!


楼主,接口,这个 概念其实是为了标准,


不知道你做过网页没有……

像 <html> , <a> </a> 这样的标签,每个浏览器都要支持它,你要问为什么要支持它,因为好多程序员都要调用它!!

很多程序员都被灌输这样的概念,比如说看到 <a href= 'www.baidu.com '> 百度 </a> 就知道这是一个链接到百度的超链!!还比如说:JS函数 document.getElementById( "myid ");这句话;浏览器的制造厂商要让程序员调用它的时候会产生“得到ID为‘myid’的标签的值”的这种效果!!具体它是怎么实现的,我们不知道!!我们调用的时候,只管它产生的效果!!!,我们为什么这么相信这些函数呢,因为我们相信这些厂商实现了这些“接口”(标准),当然也有一些倔强的人,像微软的IE,很多都不标准,比如说(本来在火狐下的网页,在你IE下就变形了,为什么),(所以好多人都在骂微软)

那些浏览器厂商,像微软,谷歌,苹果,还有像什么搜狗,腾讯的都要让“程序员”在调用这些“接口”的同时都要产生一致的效果!!!这就是接口的作用!!!


其实吧!!像C# 的语吧吧!!你为啥要这样子写呢!!因为这是个标准!!你要是写错了,编译器就不认识你!!

可能你一直用一些像VS,esclipse这样的智能工具,所以你就漠视了这些概念!!


说白了!!接口是啥,接口就是:能让别人调用,并会产生一致性效果的东西!!!像C#,Java里的那些关键字,系统函数啥的都可以称为“接口”!!

接口只是为了一致性的东西!!!

你不要认为它很神性!!

它就是抽象出的一种概念而己!!!
------解决方案--------------------
接口是个特殊的类,这个类,已经定义了很多函数,但没有实现。

比方说,它定义了两个函数,一个是从表Users中读数据,一个是向表Users写数据。但,怎么实现,要由继承它的类来决定。
interface IUsers
{
Read();
Write();
}
你可以继承这个接口写两个类,一个类从SQL数据库读数据,写数据;一个类从Orecle数据库读数据,写数据。
class SqlUsers:IUsers
{
Read()
{
//从SQL读数据...
}
Write()
{
//向SQL写数据...
}
}
class OrecleUsers:IUsers
{
Read()
{
//从Orecl读数据...
}
Write()
{
//向Orecl写数据...
}
}

使用的时候,是这样的:
IUsers Iusers=new SQLUsers();

IUsers Iusers=new OrecleUsers();

注意,这就是使用接口的最大好处,实例化两个类,都赋给了一个接口变量Iusers。
这样,接口Iusers以上的代码,就与具体操作哪个数据库没有关系了。
你实例化的是SQL数据库类,应用层操作的就是SQL数据库;你实例化的是Orecle数据库类,应用层操作的就是Orecle数据库。

你想要的最通俗易懂的例子,就是USB接口。
你往USB接口上插的是U盘,计算机操作的就是U盘;
你往USB接口上插的是移动硬盘,计算机操作的就是移动硬盘;
你往USB接口上插的是mp4,计算机操作的就是mp4。

------解决方案--------------------
使用的时候,是这样的:
IUsers Iusers=new SQLUsers();

IUsers Iusers=new OrecleUsers();

Iusers.Read();

Iusers.Write();
------解决方案--------------------
接口?插座的接口明白吧?二孔和三孔的区别,三孔的插头插不进二孔的插口。
例子,三个模块,A模块有添加,删除,修改,B模块有添加,删除,C模块有修改,删除
写三个接口,分别装下面三个方法
public Interface ICanAdd{ void Add(参数一般放数据的基类);}
public Interface ICanDelete{ void Delete(参数一般放数据的基类);}
public Interface ICanEdit{ void Edit(参数一般放数据的基类);}
然后A去实现ICanAdd,ICanDelete,ICanEdit
B去实现ICanAdd,ICanDelete
C去实现ICanDelete,ICanEdit
Type type = typeof(A);
Type有个GetInterfaces方法Type[] arrInterfaces = type.GetInterfaces();
取得一个数组,写个循环判断是否有你想要的功能对应的接口
foreach(var i in arrInterfaces){
if(i.Equals(typeof(ICanAdd))){
那么它可以添加数据,剩下的自己处理吧
}
}
------解决方案--------------------
继承:is-a
关联:has-a
实现接口:can-do

一个类实现接口就是做出承诺:我可以做某事。比如, Int32和String都实现 IComparable,就是说,可以对它们进行比较大小的操作,Int32 不实现 IEnumerable 而 String 实现 IEnumerable,就是说,可以遍历字符串,而不能遍历 Int32。楼主可能会问,Int32 和 String 是不是可以比较的,写在文档里就够了,为什么要实现接口呢?举个例子,排序依赖于比较,假设楼主有一个非常好的排序算法,那么,你是希望只实现一次,还是希望每遇到一个可比较的类型就重新实现一次?程序员不同于公务员,一定会选前者,这时候,接口就是一个技术手段。因为 Int32 和 String 都承诺它们是可比较的,所以,就可以不必关系它们的具体类型,而针对 IComparable 实现算法了。这个就是所谓多态。接口就是为了获得多态性。

------解决方案--------------------
struct 接口1 abstract
{
virtual void func1() = 0;
virtual int func2(int) = 0;
};

约等于

struct 接口2
{
typedef void (__cdecl * cbkfunc1)();
typedef int (__cdecl * cbkfunc2)(int);
cbkfunc1 func1;
cbkfunc2 func2;
};

自己建个工程玩玩,只要有虚函数,就有虚表,类实例的第一个指针指向虚表,你可以自己把虚表改了玩玩