在我看来,两者interface
都abstract function
非常相似,
这就像命令必须执行某些方法,
那么有什么区别呢?
引用:(e-satis 很好的解释)
界面
接口是一种契约:编写接口的人说“嘿,我接受这样的东西”,使用接口的人说“好吧,我写的类是这样的”。
而接口是一个空壳,只有方法的签名(名称/参数/返回类型)。这些方法不包含任何内容。界面什么都做不了。这只是一个模式。
EG(伪代码):
// I say all motor vehicles should look like that :
interface MotorVehicle
{
void run();
int getFuel();
}
// my team mate complies and write vehicle looking that way
class Car implements MotoVehicle
{
int fuel;
void run()
{
print("Wrroooooooom");
}
int getFuel()
{
return this.fuel;
}
}
实现一个接口消耗的 CPU 很少,因为它不是一个类,只是一堆名称,因此不需要进行昂贵的查找。在嵌入式设备等重要方面非常有用。
抽象类
与接口不同,抽象类是类。使用起来更昂贵,因为从它们继承时需要进行查找。
抽象类看起来很像接口,但它们还有更多的东西:你可以为它们定义一个行为。更多的是关于一个人说“这些课程应该看起来像那样,并且他们有共同点,所以请填空!”。
例如:
// I say all motor vehicles should look like that :
abstract class MotorVehicle
{
int fuel;
// they ALL have fuel, so why let others implement that ?
// let's make it for everybody
int getFuel()
{
return this.fuel;
}
// that can be very different, force them to provide their
// implementation
abstract void run();
}
// my team mate complies and write vehicle looking that way
class Car extends MotorVehicule
{
void run()
{
print("Wrroooooooom");
}
}
在没有多重继承的语言中,差异非常重要。在 php 或 Java 术语中,一个类可能实现多个接口,但只能从一个可能是抽象的父类继承。
例如,在 c++ 中,区别变得不那么重要了。