界面和抽象类有什么区别?

界面和抽象类的区别究竟是什么?


接口

一个界面是一个合同 :编写界面的人说,“嘿,我接受这样的事情”,而使用界面的人说:“好的,我写的课程就是这样看的。

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

例如(伪代码):

// 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__方法)之间的混合。

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


抽象类和接口之间的主要技术差异是:

  • 抽象类可以有常量,成员,方法存根(没有主体的方法)和定义的方法,而接口只能有常量和方法存根。

  • 抽象类的方法和成员可以用任何可见性来定义,而接口的所有方法都必须定义为public (默认情况下它们是公共定义的)。

  • 当继承抽象类时,具体的子类必须定义抽象方法,而抽象类可以扩展另一个抽象类,而不必定义来自父类的抽象方法。

  • 同样,扩展另一个接口的接口不负责从父接口实现方法。 这是因为接口不能定义任何实现。

  • 子类只能扩展单个类(抽象或具体),而接口可以扩展或者类可以实现多个其他接口。

  • 子类可以定义具有相同或较少限制性可见性的抽象方法,而实现接口的类必须定义具有完全相同可见性(public)的方法。


  • 一个接口只包含功能的定义/签名,如果我们有一些共同的功能以及共同的签名,那么我们需要使用一个抽象类。 通过使用抽象类,我们可以同时提供行为和功能。 另一个继承抽象类的开发人员可以很容易地使用这个功能,因为他们只需要填充空白。

    在这里输入图像描述

    取自:

    http://www.dotnetbull.com/2011/11/difference-between-abstract-class-and.html

    http://www.dotnetbull.com/2011/11/what-is-abstract-class-in-c-net.html http://www.dotnetbull.com/2011/11/what-is-interface-in -C-net.html

    链接地址: http://www.djcxy.com/p/1583.html

    上一篇: What is the difference between an interface and abstract class?

    下一篇: What are the differences between type() and isinstance()?