向高手请教一下 接口的实用性问题 ( 积分: 200 )

  • 主题发起人 主题发起人 大花鸡
  • 开始时间 开始时间

大花鸡

Unregistered / Unconfirmed
GUEST, unregistred user!
接口本身是声明,在使用接口时,还得用实现了接口的类来操作,那还要接口有什么用啊?完全可以不用接口,而只使用该类就行了吗。不明白为什么要使用接口,它有什么实用性啊?
 
接口可以让类之间的耦合关系脱耦,你不必知道实现这个功能的具体类对象的声明就能直接使用这个功能。整个Window到处都充满了接口。
 
是呀 一个类 可以有多个接口 可以根据需要给不同的人 或者类 不同的接口 功能独立使用方便
 
To:zqw0117
比如有一接口 IInterFaceA ,它定义了一些方法,可是我们在使用时不能直接声明一个变量 A:IInterFaceA ,然后就A.XXXX,必须要先生成实现接口类的实例,TA,然后再 A := TA as IInterFaceA,再使用A,这样不还是要使用实现类吗。不用接口,直接就用TA不是一样吗?
 
如果你想隐蔽类的具体实现 还是用接口合适一些
 
经验多了,学习深入了就慢慢了解了
如果你的软件不考虑复用,可以说面向对象里面的多态没有什么用处
接口也没有什么用处
如果看了设计模式,发现里面到处充斥了接口的用处(C++中用抽象类模拟接口)

简单两个例子说明一下接口的用处
1。解除强耦合,增强复用性
假设你要开发一个控制系统,使用串口进行通讯,主要有两个操作,读和写
按照你说的方法那么在主程序中定义一个类
TConnection
里面定义两个方法
TConnection.Read;
TConnection.Write;
然后写实现的方法
在使用的时候就
TmpConn := TConnection.Create;
try
TmpConn.Write……
但是如果后来需要将这个通讯方法改成USB,或者并口,或者CAN总线,或者TCP/IP或者其他怎么办?
只能重写代码
而使用接口来实现就相对增强了复用
比如定义一个接口
IConnection
里面包含两个方法Read和Write
这样你的主程序只要使用接口就可以了,将实现接口的类的实现独立成一个DLL(驱动)
这样将来若要换其他的通讯方式,你只要更新这个DLL就可以了,主程序因为接口部分稳定所以不需要更改,这样就降低了重写主程序造成的风险
 
2。接口利于团队开发
在多层中往往需要有人开发表现层,有人开发业务层等等
这样只要定义好一个接口,表现层的程序员就可以使用这个接口进行表现层的开发
而不一定要等到业务层的程序员完全写好类之后你才能调用
 
你明白抽象类的优势吗?
如果你不明白,那么理解接口恐怕比较困难。
按照你的想法,接口其实也可以看到优势的。
比如说你有两个类,TA、TB,这两个类没有什么继承关系,但是都实现了IRun这个接口。
那么,在我使用Run功能的部分,我只需要操作IRun这个接口就可以得到TA或者TB两种不同风格的Run。这对编写通用的架构,尤其是编写插件结构的应用,是十分有利的,可以使用统一的代码而实现灵活的功能。
 
不错,楼上各位大侠说的都有些道理,特别是muhx所举的例子更具实际意义。你如果还是不能理解的话,我给你一个日常生活的例子可能更能易于理解。
通俗的讲“接口”(Interface)其实就是一个公共可用的界面(或者通道),就好比是我们家里面或者办公室里面的电源插座一样(Outlet,当然Outlet有三插的也有两插的)。而每个接口都仅仅声明了必要的服务而没有去具体实现它们,之所以这样作就是想要实现具有更大灵活性的目的,这就好比每个电源插座都没有指明具体是给什么电器供电的一样。试想,假如每一种电器都需要一个特定的电压等级以及一种特定的频率、相位的话,那也就是说要为每种电器配备一种电源插座(更极端的情况是每种电器的每个型号要具体配备一种电源插座),那么我们的办公室和家里的墙壁上就将是布满插座的了!而且我们在装修好房子后高高兴兴的把电视机买回家里的时候确突然在布满密密麻麻插座的墙上竟然忘记了安装给这种电视机专用的插座了!那结果是怎么样呢?要么再次把墙面破开埋线安装特定的插座,要么就是把那台刚刚搬回家的Favorite电视机给退掉了...
这个生活上的例子可笑吗?是的!很可笑。但是,回过头来想想我们做的程序有多少是按照这种可笑的方式实现的呢??几乎绝大多数都是,甚至全部是这样的系统!在用户需求稍一变动的情况下则要修改系统的大部分,有的时候甚至是全部。那么我们为什么不使用类似Outlet(电源插座)的方式来编写软件使它们具有更大的灵活性呢?所以接口(Interface)——一种类似于Outlet的仅仅声明规约而没有具体实现的方式就应运而生了...
不知道我这么说楼主是否会领会接口的用途?:)希望对你理解接口有所帮助。
 
楼上的几位大侠的说的接口的作用我能理解。我所不理解的是,接口在使用时,它依然是以实现接口的类为依托,那么说接口是完全通用的电源接头,就不太会是100%的通用性,它依然是受实现接口的类来制约的。比如两个口的插座(220V的),它可以接很多电器,可是这只是一个外表,而在还是里面的线路来决定的。我们使用插座时,不是接它的外壳,而是要通过外壳接内存的线路,虽然我不清楚线路的设计,但是去掉外壳,只保存两个线路(虽然会提交触电的可能),我们依然可以使用。
说到这里,其实我就是不明白使用接口 和 使用实现接口的类 相比,为什么一定要把实现的类,变成接口再用呢?
 
其实就是接口使用的困惑。接口有很多好处,在团队开发时,不必等类全部做完,只要知道接口就可以了,接口是相对固定的。但是实现接口的类,如果有问题,不能正确执行,那接口还能被调用吗? 接口不都是 先Create实现接口的类,然后再转换成接口吗。接口实现类的Create就有问题,还能用接口吗? 如果不能用,那接口的这个作用就不明显了吧
 
比如有3个类实现了接口 IMyInterface中的方法,这三个类的实现功能不同,那我在调用接口时,接口知道该用哪个实现类的方法吗?
 
楼主问的很好!说明例子你也看懂了。我们这里所说的接口其实是从抽象类(就如同C++中的纯虚类一样)通向具体类的一个“界面”。而楼主所说的具体的“220V交流电”就是这个万变不离其宗的“纯虚类”,而插在插座(接口)上的各种电器(比如:我先前所说的电视机)就好比是客户所需要的各种功能。从软件工程理论上来讲,用户的宏观需求(例如:管理理念、经营模式等)是在一定历史时期内保持不变的或者说是相对稳定的,而在此宏观需求下的具体实现却是保持相对活跃的(比如:产品设计可能今年由新产品研发部门来做,而明年则因精简机构而将新产品研发部门并入生产部门。但是从一定历史时期来说新产品研发这项工作对于生产型企业来说是不可或缺的)。那么,我们就可以把新产品研发这个抽象的宏观性问题构造为相对稳定的纯虚类(相对稳定部分)而对外输出其接口(如:新产品研发,至于具体如何研发,由哪个部门研发甚至是研发什么则有引用此接口的具体类来实现)。这就好比是,Outlet仅仅提供220V交流电的模式,而具体则可以为千差万别的电器提供能源或动力了,当然你(所采用的电器)要实现我的接口(220V交流50Hz)即可。
 
还是说那个插座的例子(呵呵,这个例子比较有趣),具体到某个电器上,你肯定需要一个确切的电压了,但是,你有没有想过,正是所有的厂商都遵循着插座的接口标准(插座的两个插孔之间的距离,以及插孔的深度)才能让你的任意一个插头可以插入任意一个插座呢?比如,浴室你买了个防水的插座,卧室你买了普通的插座,客厅你买了个安全插座(防止小孩子把手指插入的那种插座),但是没有关系,因为大家都遵循着同一个插座接口标准,因此你的剃须刀(需要插交流电源的那种),可以在任何一间房间中使用。还有,你出国了,有些国家使用的是110伏的电源,当你到这些国家时,给手机充电依然可以使用标准的插头进行充电。这也是接口的好处。在这里,每个插座所使用的材料、形状以及所接的电压,都是每个具体插座所决定的,同时,每个插座也都事先了上面我提到的那个标准的插座接口,当你使用了某个插座,那么也就固定了其特性,就如同你在内存中需要创建一个类才能使用接口一样。
因此,具体到一个实在的应用(中国的某个浴室,使用220伏防水插座),你或许看不到接口的好处,但是,放眼全世界房间中的插座,你是不是就能看到接口的重要性呢?
如果你是一个插座的生产厂商,如果有可统一的接口,那么你引入一套生产线,就可以生产出来可以插任何复合标准插头接口的插头,这是不是能为你节省大量的生产成本呢?(要没有这个插头标准,那你的生产线恐怕要很多条才能满足不同插头的要求了吧,呵呵)。
看接口的好处,请你把自己放在国际知名品牌的插座生产厂商的位置上。
 
首先谢谢几位大侠的耐心讲解。读完几位的论述,我明白了接口的作用,也让我明白了过去对接口的一些误解。其实接口就是一个标准,定义了一些通用的标准,很多类都要提供这些标准,至于内部做哪些修改,使用者无需知道。就像手机可以打电话,收短信,我们却无需知道为什么可以打电话,为什么可以收短信。但是,所有的手机都要有这些功能。像打电话、收短信、有铃声提示……都是接口定义的标准,对吧?

下面我们再讨论一下接口的使用吧。
比如对字符串的操作(替换、删除,插入、加前缀,加后缀……)。这些功能很通用,它们是可以做成一个接口发布出来的。
假设一个程序,要批量修改一系列字符串(他们是相似的,或有规则的),我要先录制一个宏,来记录对这些字符串的操作顺序(TRuleCumtom,简称TRC)。录制完成之后再统一的批量修改。 但是,在录制宏的过程中,要找一个例子字符串,在每定一条操作时,要调用接口的某个方法来验证操作是否正确,返回操作的结果,再添加宏的内容。
在定义完之后,由主窗体来调用包含这些字符串信息的类(TResourceManager,简称TRM),并由此类来完成字符串的转换工作(还要用到接口)。
于是,我要在TRC中实现接口的实现类,转换成接口。在TRM中也实现接口。
上面的功能看上去就可以用一个类来实现,但为了方便以后其它程序使用,就做成接口。
不知道这样做是否合适。

另外, 可以把接口和接口实现的类放到DLL中,在DLL中只能发布函数,能发布接口吗?如果能,怎么实现或调用接口呢?
 
你应该看看com原理与应用这本书,这本书解决了你上面的困惑!!
 
谢谢各位 :)
 
后退
顶部