为什么要在语法层面区分接口和抽象类?

时间:2012-07-21 15:29:34

标签: class syntax interface language-design abstract

免责声明:这不是关于理解abstract class es和interface之间区别的问题。如果你没有得到,请再次阅读标题我精通合同和半实现子系统之间的区别。)

让我们把Java作为一个例子。似乎不需要一个独特的关键字interface,从我作为开发人员的角度来看,编译器吐出完全相同的东西,在人类说话中,“你不能利用它直到你派生(通过implementsextends)一个实现其方法的新类“。简单。

但有一种情况可能会阻止这两者的混淆:当我们需要implement多个interface时,因为Java不允许多重继承(对于class es) 。当然,以这样的方式构建语言是很简单的,即编译器可以识别何时存在任何方法体或声明的变量,并且随后在适当的情况下不允许多个implements / extends?那么优先顺序会出现问题吗?

这是我们进行这种句法区分的唯一原因吗?

P.S。我提出这个问题的一个原因是,这种情况对于理解新的OO程序员会带来相当大的挑战,我认为在语言层面以更加简化的方式处理这一问题将极大地帮助更快地掌握概念差异。

1 个答案:

答案 0 :(得分:2)

  

当然,以这样一种方式构建语言是很简单的,即编译器可以识别何时存在任何方法体或声明的变量,并且随后在适当的时候禁止多工具/扩展?

让我们说你做到了。所以你的语言允许你这样做:

class Foo extends A, B, C {
}

只要BC中的每个方法都是抽象的,它就不会抱怨。好又花花公子。

现在让我们说你没有创建B。这是别人写的其他一些包。他们对您的班级Foo一无所知。当他们制作B时,其中的所有内容都是抽象的,但这只是一个巧合:他们没有碰巧有任何具体的内容。

稍后,他们决定向B添加另一个方法,其中 具体。现在,他们没有意识到,他们已经打破了你的班级Foo

有一个明确的interface结构的一个论点是,它使得B的作者的意图对于消费它的人来说是明确的。

总的来说,我认为你的问题很好。我工作的语言,Dart,实际上接近你所说的:它现在有一个明确的interface语法,但它被删除而支持纯抽象类。