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

Class 为什么要在语法层面区分接口和抽象类?,class,syntax,interface,language-design,abstract,Class,Syntax,Interface,Language Design,Abstract,(免责声明:这不是一个理解抽象类es和接口s之间区别的问题。如果您没有理解,请重新阅读标题。我非常熟悉合同和半实现子系统之间的区别。) 让我们以Java为例。似乎不需要一个独特的关键字接口,但从我作为一名开发人员的角度来看,编译器给出了完全相同的东西,用人的话说就是,“在派生(通过实现或扩展)一个实现其方法的新类之前,您无法使用它”。简单 但是有一种情况可以防止这两种情况的合并:当我们需要实现多个接口时,因为Java不允许多重继承(对于类)。当然,以编译器能够识别何时存在任何方法体或声明的变量的

免责声明:这不是一个理解
抽象类
es和
接口
s之间区别的问题。如果您没有理解,请重新阅读标题。我非常熟悉合同和半实现子系统之间的区别。)

让我们以Java为例。似乎不需要一个独特的关键字
接口
,但从我作为一名开发人员的角度来看,编译器给出了完全相同的东西,用人的话说就是,“在派生(通过
实现
扩展
)一个实现其方法的新类之前,您无法使用它”。简单

但是有一种情况可以防止这两种情况的合并:当我们需要实现多个接口时,因为Java不允许多重继承(对于类)。当然,以编译器能够识别何时存在任何方法体或声明的变量的方式构建语言,并随后在适当的情况下禁止多
实现
/
扩展
,这将是微不足道的?那么,优先顺序是否存在问题

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

另外,我问这个问题的一个原因是,这个场景会给新的OO程序员带来相当大的理解挑战,我认为在语言级别以更精简的方式处理这个问题,将大大有助于更快地掌握概念上的差异

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

假设是你干的。因此,您的语言允许您这样做:

class Foo extends A, B, C {
}
只要
B
C
中的每个方法都是抽象的,它就不会抱怨。漂亮漂亮

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

后来,他们决定在
B
中添加另一种具体的方法。现在,没有意识到,他们已经破坏了你的类
Foo

拥有明确的
接口
结构的一个理由是,它使
B
作者的意图对使用它的人来说是清楚的


总的来说,我认为你的问题是个好问题。我所研究的语言Dart实际上与您所说的非常接近:它现在有一个显式的
接口
语法,但它正在被删除,取而代之的是纯抽象类。

“编译器在有任何方法体或声明的变量时会识别,并在适当的情况下不允许多个实现/扩展”比要求显式声明差异更容易理解(我真的不知道)@Mat我接受你的观点,但我绝对认为如果以正确的方式处理,它是可以的。其他人可以自由地建议这样一种方式。可能是,可能不是,但不是。问为什么没有多大意义,除非你问的是Jim Gosling,而你不是。一个相反的论点是改变以前没有实现的东西拥有它们将使所有现有的扩展/实现类失效,除非重新编译它们,否则现在只能在运行时检测到:这不是一个有吸引力的选择。这是Gosling的原因,还是唯一的原因,这是任何人的猜测。最后,这是一个明智的答案。谢谢分享。即使a、B或C中没有一个包含任何内容如果这会阻止它成为一个接口,
Foo
的父类型应该是什么。那么
Bar的父类型扩展了A、Foo、C、B
?如果A、B和C都是完全抽象的,那么假设的语言可以使用or对象作为一个具体的超类。两者都可以工作。