接口和抽象类之间有什么区别?

接口和抽象类之间到底有什么区别?

解决办法

接口

一个接口是一个*的契约。编写接口的人说:"嘿,我接受事情的样子",而使用接口的人说:"好,我写的类是这样的*"。

接口是一个空壳。只有方法的签名,这意味着这些方法没有主体。接口不能做任何事情。它只是一个模式。

例如(伪代码)。

// I say all motor vehicles should look like this:
interface MotorVehicle
{
    void run();

    int getFuel();
}

// My team mate complies and writes vehicle looking that way
class Car implements MotorVehicle
{

    int fuel;

    void run()
    {
        print("Wrroooooooom");
    }

    int getFuel()
    {
        return this.fuel;
    }
}

实现一个接口只消耗很少的CPU,因为它不是一个类,只是一堆名字,因此没有任何昂贵的查找工作要做。在重要的时候,例如在嵌入式设备中,这是很好的。


抽象类

抽象类,与接口不同,是类。它们的使用成本较高,因为当你继承它们的时候,需要做一个查询。

抽象类看起来很像接口,但它们有更多的东西。你可以为它们定义一个行为。它更像是一个人在说:"这些类应该是这样的,它们有这个共同点,所以要填空!"。

比如说。

// I say all motor vehicles should look like this:
abstract class MotorVehicle
{

    int fuel;

    // They ALL have fuel, so lets implement this for everybody.
    int getFuel()
    {
         return this.fuel;
    }

    // That can be very different, force them to provide their
    // own implementation.
    abstract void run();
}

// My teammate complies and writes vehicle looking that way
class Car extends MotorVehicle
{
    void run()
    {
        print("Wrroooooooom");
    }
}

实施

虽然抽象类和接口应该是不同的概念,但实现使这种说法有时并不真实。有时,它们甚至不是你所认为的那样。

在Java中,这条规则被严格执行,而在PHP中,接口是没有声明方法的抽象类。

在 Python 中,抽象类更像是你可以从 ABC 模块中得到的编程技巧,实际上是在使用元类,也就是类。而接口在这种语言中更多的是与鸭子的类型有关,它是惯例和调用描述符的特殊方法(__method_方法)的混合。

和通常的编程一样,有理论,有实践,还有另一种语言的实践 :-)

评论(22)

在这里可以找到一个解释。

抽象类是一个类,它 只被程序员部分实现的类。 程序员实现的类。它可能包含一个或多个 抽象方法。一个抽象方法 是一个简单的函数定义,它 用来告诉程序员该 方法必须在一个子类中实现 类中实现。

一个接口类似于一个抽象的 类;事实上,接口占用了 与类和抽象类占据相同的命名空间。 类。由于这个原因,你不能 定义一个与类同名的接口 与类同名。一个接口是一个完全 抽象类;它的任何方法 被实现,而不是一个类 从它的子类化,而是说它要 实现该接口。

总之,我觉得这种对接口的解释有点令人困惑。一个更常见的定义是。*一个接口定义了一个实现类必须履行的契约。一个接口定义由公共成员的签名组成,没有任何实现代码。

评论(3)

其实并不是原问题的答案,但一旦你对它们之间的区别有了答案,你就会进入何时使用的两难境地。 https://stackoverflow.com/questions/1231985/when-to-use-interfaces-or-abstract-classes-when-to-use-both

我对OOP的了解有限,但把接口看成是语法中的形容词的等价物,直到现在对我来说都很有效(如果这个方法是假的,请纠正我!)。例如,接口名称就像你可以给一个类的属性或能力,一个类可以有很多接口。ISerializable, ICountable, IList, ICacheable, IHappy, ...

评论(0)