- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
(免责声明:这不是关于理解抽象类
和接口(interface)
之间区别的问题。如果你没有得到那,请再读一遍标题。我很清楚契约和半实现子系统之间的区别。)
让我们以 Java 为例。似乎几乎不需要一个独特的关键字interface
,从我作为开发人员的角度来看,编译器吐出完全相同的东西,用人类的话说就是,“你不能利用直到您派生(通过 implements
或 extends
)一个实现其方法的新类”。简单。
但是有一种情况可能会阻止将这两者混淆:当我们需要实现
多个接口(interface)
时,因为Java不允许多重继承(对于类
es)。当然,以这样一种方式构建语言是微不足道的,编译器可以识别何时有任何方法体或声明的变量,并随后禁止 multi-implements
/extends
where合适的?那么优先顺序会不会出现问题?
这是我们具有这种句法差异的唯一原因吗?
附言我问这个问题的一个原因是,这种情况可能会给新的 OO 程序员带来相当大的理解挑战,我认为在语言级别以更流线型的方式处理这个问题,将极大地有助于更快地掌握概念上的差异。
最佳答案
Surely it would be trivial to build the language in such a way that the compiler recognises when there are any method bodies or declared variables, and subsequently disallows multi-implements/extends where appropriate?
假设您确实这样做了。所以你的语言允许你这样做:
class Foo extends A, B, C {
}
只要 B
和 C
中的每个方法都是抽象的,它就不会提示。很好,花花公子。
现在假设您没有创建B
。它在其他人写的其他包中。他们对你的类Foo
一无所知。当他们制作 B
时,其中的所有内容都是抽象的,但这只是一个巧合:他们碰巧还没有任何具体的内容可以放入其中。
后来,他们决定向 B
添加另一个方法, 是具体的。现在,他们在不知不觉中破坏了您的 Foo
类。
拥有显式 interface
构造的一个论点是,它使 B
的作者的意图对使用它的人来说很清楚。
总的来说,我认为你的问题很好。我使用的语言 Dart 实际上与您所说的很接近:它现在有一个显式的 interface
语法,但它正在被删除以支持纯抽象类。
关于class - 为什么要在句法层面区分接口(interface)和抽象类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11593455/
是否有可能在对象的类级别上实现这一点?具体来看这个有一个包含 WatchConnectivity 但也支持 iOS8 的应用程序 class Test { if #available(iOS
我是一名优秀的程序员,十分优秀!