Mla*_*vić 10 oop language-features abstract-class interface multiple-inheritance
这不是关于抽象类和接口之间差异的另一个问题,所以请在投票结束之前再三考虑.
我知道接口在那些不支持多重继承的OOP语言中是必不可少的 - 比如C#和Java.但那些具有多重继承的人呢?在具有多重继承的语言中,接口(作为特定语言特性)的概念是多余的吗?我猜可以使用抽象类来建立类之间的OOP"契约".
或者,更明确地说,C#和Java中的接口只是它们不支持多重继承的结果?
一点也不.接口定义契约而不指定实现.
因此即使存在多重继承也需要它们 - 继承是关于实现的.
从技术上讲,您可以在多继承中使用抽象类来模拟接口.但是因此可以倾向于在那里写一些实现,这将产生很大的混乱.
取决于冗余测试.
如果测试是"可以在没有语言功能的情况下实现此任务"那么类本身就是多余的,因为有图灵竞争语言没有类.或者,从工程基础来看,机器代码以外的任何东西都是多余的.
实际上,测试是语法和语义的更微妙的组合.如果不改进语言的语法或语义,对于合理数量的用途,事情是多余的.
在进行区分的语言中,支持接口声明类知道如何以某种方式进行交谈.继承自另一个类导入(并且可能扩展或修改)另一个类的功能.
由于这两个任务在逻辑上不相同,我认为接口不是冗余的.区分这两者可以改进大量程序的语义,因为它可以更具体地指示程序员的意图.
......缺少多重继承迫使我们添加接口的概念......
所以,是的,我相信在多重继承的情况下,接口是多余的.您可以在支持多继承或混合的语言中使用纯抽象基类.
也就是说,我对大部分时间的单一遗产都很满意.埃里克·利珀特(Eric Lippert)在同一卷(第10页)中提出了这一观点,即选择单一继承"......一举消除许多复杂的角落案件......"
有些语言支持多重继承,不包括Java接口的并行概念.埃菲尔就是其中之一.Bertrand Meyer没有看到他们的需要,因为有能力定义一个延迟类(这是大多数人称之为抽象类的东西)与一个充实的契约.
缺少多重继承可能导致程序员需要创建实用程序类等以防止在实现相同接口的对象中编写重复代码的情况.
可能是合同的存在是对缺乏完全无实现的接口概念的重要贡献......如果没有一些实施细节来进行测试,合同就更难写.
因此,技术上接口在支持MI的语言中是多余的.
但是,正如其他人所指出的那样......多次继承可能是一个非常棘手的事情,无论如何都要正确使用.我知道我不能......我为Meyer工作,因为他正在起草面向对象软件构建,第2版.
| 归档时间: |
|
| 查看次数: |
770 次 |
| 最近记录: |