我已经看过几回这个问题了,我不清楚它是什么意思。 您什么时候以及为何要这样作? 算法
我知道接口的做用,可是我对此不清楚,这使我以为我错过了正确使用它们的机会。 数据库
若是要这样作,是否只是这样: 编程
IInterface classRef = new ObjectWhatever()
您可使用实现IInterface
任何类吗? 您何时须要这样作? 我惟一能想到的是,若是您有一个方法,而且不肯定要实现IInterface
对象,则不肯定该对象将被传递。 我不认为您须要多久这样作一次。 设计模式
另外,您如何编写一个接受实现接口的对象的方法? 那可能吗? 数组
接口的编程与Java或.NET中的抽象接口绝对无关。 它甚至不是OOP概念。 数据结构
这意味着不要搞乱对象或数据结构的内部。 使用抽象程序接口或API与您的数据进行交互。 在Java或C#中,这意味着使用公共属性和方法而不是原始字段访问。 对于C,这意味着使用函数而不是原始指针。 框架
编辑:对于数据库,这意味着使用视图和存储过程,而不是直接表访问。 函数
C ++解释。 性能
将接口视为类的公共方法。 编码
而后,您能够建立一个“依赖”这些公共方法的模板,以执行其本身的功能(它使在类的公共接口中定义的函数调用)。 能够说,此模板是一个容器,例如Vector类,而且它依赖的接口是搜索算法。
定义函数/接口Vector进行调用的任何算法类都将知足“合同”(如原始答复中所解释的)。 这些算法甚至没必要是相同的基类。 惟一的要求是在算法中定义Vector依赖的函数/方法(接口)。
全部这些的目的是,您能够提供任何不一样的搜索算法/类,只要它提供了Vector依赖的接口(气泡搜索,顺序搜索,快速搜索)便可。
您可能还须要设计其余容器(列表,队列),这些容器能够经过使它们知足您的搜索算法所依赖的接口/合同来利用与Vector相同的搜索算法。
这样能够节省时间(OOP原则“代码重用”),由于您可以针对建立的每一个新对象编写一次而不是一次又一次地编写算法,而不会因过分使用继承树而使问题复杂化。
至于“错过”事情如何运做; 大型应用程序(至少在C ++中),由于这是大多数标准TEMPLATE库框架的工做方式。
固然,当使用继承和抽象类时,对接口进行编程的方法会发生变化。 可是原理是同样的,您的公共函数/方法是您的类接口。
这是一个巨大的主题,也是“设计模式”的基石原则之一。
那里有不少解释,但要使其更加简单。 以List
为例。 可使用如下方式实现列表:
经过构建接口,说一个List
。 您只须要编码List的定义或List
实际上的含义。
您能够在内部使用任何类型的实现,例如array
实现。 可是假设您出于某种缘由(例如错误或性能)而但愿更改实现。 而后,您只须要将声明List<String> ls = new ArrayList<String>()
更改成List<String> ls = new LinkedList<String>()
。
代码中没有其余地方,您是否须要更改其余任何内容? 由于其余全部内容都基于List
的定义。
问:-...“您能使用任何实现接口的类吗?”
答:是的。问:-...“您何时须要这样作?”
答:-每次须要一个实现接口的类。
注意: 咱们没法实例化类未实现的接口 -True。
AnIntf anInst = new Aclass();
// 仅当 Aclass实现AnIntf时,咱们才能这样作。
// anInst将具备Aclass引用。
注意: 如今咱们能够理解,若是Bclass和Cclass实现相同的Dintf,会发生什么。
Dintf bInst = new Bclass(); // now we could call all Dintf functions implemented (defined) in Bclass. Dintf cInst = new Cclass(); // now we could call all Dintf functions implemented (defined) in Cclass.
咱们所拥有的:相同的接口原型(接口中的函数名称),并调用不一样的实现。
参考书目: 原型-维基百科
短篇小说:要求邮递员回家后回家,并接收包含其上写有地址的封面(信件,文件,支票,礼品卡,申请书,情书)。
假设没有掩护,请邮递员回家后收拾全部东西并交付给其余人,邮递员会感到困惑。
因此最好用封面包好(在咱们的故事中是界面),而后他会作得很好。
如今,邮递员的工做是仅接收和交付封面(他不会打扰封面中的内容)。
建立不是实际类型的interface
类型,而是使用实际类型实现它。
建立接口意味着您的组件能够轻松适应其他代码
我举一个例子。
您具备以下的AirPlane界面。
interface Airplane{ parkPlane(); servicePlane(); }
假设您的飞机控制器类中有一些方法,例如
parkPlane(Airplane plane)
和
servicePlane(Airplane plane)
在您的程序中实现。 它不会破坏您的代码。 个人意思是,只要接受像AirPlane
这样的参数,就不须要更改。
由于它将接受任何飞机,而无论实际的类型, flyer
,高highflyr
, fighter
等。
另外,在集合中:
List<Airplane> plane;
//将搭乘您的全部飞机。
如下示例将清除您的理解。
你有一架实施它的战斗机,因此
public class Fighter implements Airplane { public void parkPlane(){ // Specific implementations for fighter plane to park } public void servicePlane(){ // Specific implementatoins for fighter plane to service. } }
HighFlyer和其余事件也是如此:
public class HighFlyer implements Airplane { public void parkPlane(){ // Specific implementations for HighFlyer plane to park } public void servicePlane(){ // specific implementatoins for HighFlyer plane to service. } }
如今考虑使用AirPlane
几回您的控制器类,
假设您的Controller类是ControlPlane,以下所示,
public Class ControlPlane{ AirPlane plane; // so much method with AirPlane reference are used here... }
神奇之处在于,您可使新的AirPlane
类型实例达到所需的数量,而且无需更改ControlPlane
类的代码。
您能够添加一个实例...
JumboJetPlane // implementing AirPlane interface. AirBus // implementing AirPlane interface.
您也能够删除之前建立的类型的实例。