由于检查对象上的其他代码未实现接口可能会导致失败。然而,这也是接口的优点,你的类不需要从某个东西扩展来实现一个接口,所以它可以从任何类任意扩展,但实现一个特定的接口,这意味着它在它的东西之外还有一些其他的功能从它的继承链中得到。所以 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
}
如果这个解释不清楚,请告诉我,我花了很长时间才掌握接口及其使用,但现在我是一个大力倡导者。
支持论点
就继承本身而言,为了清楚起见,概念是如果某事物与其他事物相似但具有与之关联的额外属性(名词)或动作(动词),则无需重新编写公共部分。
举一个常见的例子,假设你有一个类 Animal(属性如 isAlive,动作如复制)。现在假设你想为 SexualAnimal 和 AsexualAnimal 创建一个类,并且在 SexualAnimal 的rerepry 方法中接受一个参数,而AsexualAnimal 的那个没有(SexualAnimal 将具有rerepry 方法的重载版本,并会覆盖默认抛出错误)。好的,这一切都很好,现在说在我们到达 Birds 的某个地方,现在我们可以选择如何处理飞行,我们可以 A 在继承链中的某处将飞行添加为布尔值,或者 B 为飞行创建一个接口(也许我们并不关心Animal在继承树中的位置,我们只想知道它可以飞行,因此具有某些属性,如高度和动作,如takeFlight)。
另一种看待这一点的方式是,作为一名程序员,我可以编写一个接口给另一个团队,我们都可以根据接口中建立的“合同”进行操作。例如说我需要访问一个数据库来做一些操作,但我不知道他们将长期使用哪种数据库解决方案。所以我为我需要的数据库编写了一个接口,以便能够使用 X 参数获取 Y 数据,现在我可以在假设我提供 X 而你给我 Y 的情况下自由编写我的其余代码,无论如何我的代码的底层实现将起作用。
有关接口使用的更正式参考,请参见:http ://en.wikipedia.org/wiki/Design_Patterns