由于检查对象上的其他代码没有实现接口,可能会导致失败。然而这也是接口的优点,你的类不需要从某个东西延伸来实现一个接口,所以它可以任意扩展任何类,但实现一个特定的接口,这意味着它具有一些其他功能从它的继承链中获得。所以的Adobe(或任何人)代码的东西像:
if(argumentObject is ICellRenderer)
{
var icr:ICellRenderer = argumentObject as ICellRenderer; //cast so code completion can work
icr.data = data; //do some stuff on the object that only an ICellRenderer can do
}
让我知道,如果这种解释是不明确的,我花了很长的时间来与接口及其使用交手,但现在我一个巨大的倡导者。
论据
只要继承本身而言,只是为了清晰的概念是,如果事情就像别的东西,但与它相关联的额外的属性(名词)或行动(动词),你不需要重新编写通用部分。
要使用一个常见的例子说你有一个类动物(属性如isAlive,行为如重现)。现在说你想为SexualAnimal和AsexualAnimal创建一个类,并且在SexualAnimal的重现方法需要一个参数,而AsexualAnimal的重做方法不会(SexualAnimal会有重载方法的重载版本,并且会覆盖默认的抛出错误)。好吧,现在我们已经到达鸟类的某个地方,现在我们可以选择如何处理航班,我们可以在继承链中添加航班作为布尔值,或者B创建航班界面(也许我们并不关心遗传树中的哪一个动物,我们只是想知道它可以飞行,因此具有某些属性,如高度和像takeFlight一样的动作)。而不是检查你想要在飞行物上使用的每个单独的财产,你可以检查是IFlyingThing。
另一种看待这个问题的方法是,作为一名程序员,我可以编写一个接口给另一个团队,我们都可以根据接口中建立的“契约”进行操作。比如说我需要访问一个数据库来完成一些操作,但我不知道哪个数据库解决方案会长期执行。因此,我为我需要的数据库编写接口,以便能够使用X参数获取Y数据,现在,我可以自由地在我提供X的假设下自由编写其余代码,并且您给我Y,不管是什么我的代码的基础实现将起作用。
为了更正式引用的接口的用途看:http://en.wikipedia.org/wiki/Design_Patterns
如果这样的检查是不存在的。不是完全可以避免的接口? 例如,“继承”的概念也是可以避免的,但是它们的优点可以被看作是“干净的”代码生成。 但是,在“接口”的情况下,它在我看来都不是一个干净的代码。它只是“强制”一条规则,以便编译器可以在编译时停止。 (因此,程序员必须纠正错误,并做出成功的编译) –