3

免责声明:这不是关于理解abstract classes 和interfaces 之间区别的问题。如果你没有明白,请再读一遍标题。我精通合约和半实现子系统之间的区别。)

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

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

这是我们有这种句法差异的唯一原因吗?

PS 我问这个问题的一个原因是,这种情况可能会给新的 OO 程序员在理解方面带来相当大的挑战,我认为在语言级别以更简化的方式处理这个问题,将大大有助于更快地掌握概念上的差异.

4

1 回答 1

2

当然,以编译器在有任何方法体或声明的变量时识别并随后在适当的情况下禁止多实现/扩展的方式构建语言是微不足道的吗?

假设你确实这样做了。所以你的语言可以让你这样做:

class Foo extends A, B, C {
}

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

现在假设您没有创建B. 它在其他人写的其他包中。他们对你的班级一无所知Foo。当他们制作的时候B,里面的一切都是抽象的,但这只是一个巧合:他们还没有碰巧有任何具体的东西可以放在里面。

后来,他们决定在 中添加另一种方法B,这具体的。现在,不知不觉,他们破坏了你的课堂Foo

具有显式interface构造的一个论点是,它使作者的意图对B使用它的人来说清楚。

总的来说,我认为你的问题是一个很好的问题。我使用的语言 Dart 实际上与您所说的很接近:它现在具有显式interface语法,但它正在被删除以支持纯抽象类。

于 2012-07-31T17:28:32.447 回答