协慌网

登录 贡献 社区

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

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

答案

接口

接口是一个契约 :编写界面的人说:“ 嘿,我接受看起来那样的东西 ”,使用界面的人说 “ 好吧,我写的课看起来那样 ”。

接口是一个空壳 。只有方法的签名,这意味着方法没有正文。界面无能为力。这只是一种模式。

例如(伪代码):

// 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 模块获得的编程技巧,实际上是使用元类,因此也就是类。接口与这种语言中的 duck typing 更相关,它是约定和调用描述符的特殊方法(__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