oop - 接口(interface)与抽象类或一般的多态性

标签 oop interface abstract-class

我在理解接口(interface)和抽象类的使用之间的区别时遇到问题。

例如,请看下面的UML图:

Interfaces vs. Abstract Classes

这两者有什么区别?

最佳答案

我将提供代码解释和更简短的解释。如果您不想阅读,请跳至下面的“通俗易懂的英文解释”。


代码解释

  • 在 C++ 术语中,抽象类是实现某些方法但不实现其他方法的类。这意味着:您可以使用他们的一些方法,但您必须实现未实现的方法。

  • 接口(interface)是 C++ 中的纯类,也就是说,一个不实现任何东西的类,如果您希望您的类符合该接口(interface),则必须实现所有东西.

例如- 通过下面的链接试试这个

#include <iostream>
using namespace std;

// Shape is abstract class: some methods are already available, some are not
class Shape
{
public:
  // This is already implemented and ready for polymorphism
  virtual void area() { cout<<"Shape area"<<endl;}
  // You MUST implement this
  virtual void implement_me() = 0;
};

class Circle : public Shape
{
public:
  virtual void area() { cout<<"Circle area"<<endl;}
  void implement_me() { cout<<"I implemented it just because I had to"<<endl;}
};

class HalfCircle : public Circle
{
public:
  virtual void area() { cout<<"HalfCircle area"<<endl;}
};


// ShapeInterface is a pure class or interface: everything must be implemented!
class ShapeInterface
{
public:
  virtual void area() = 0;
};

class CircleFromInterface : public ShapeInterface
{
public:
  // You MUST implement this!
  virtual void area() { cout<<"CircleFromInterface area from interface"<<endl;};
};



int main() {

    Shape* ptr_to_base = new HalfCircle();
    ptr_to_base->area(); // HalfCircle area, polymorphism
    ptr_to_base->Shape::area(); // Shape area
    ptr_to_base->implement_me(); // from Circle


    ShapeInterface *ptr_to_base_int = new CircleFromInterface();
    ptr_to_base_int->area(); // Just the derived has it

    return 0;
}

http://ideone.com/VJKuZx


通俗易懂的解释

如果你想要过度简化的版本:

  • 接口(interface)通常是您需要完全遵守的“契约(Contract)”:您需要同意所有内容并实现所有内容,否则它就不起作用。

  • 抽象类是部分契约,有些东西你必须同意/实现,但也有一些东西已经存在,你可以选择是否重新实现它(覆盖)或只是懒惰并使用现有的。

关于oop - 接口(interface)与抽象类或一般的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21624105/

相关文章:

javascript - 如何遍历对象的嵌套子对象并收集名称数组

javascript - 如何以OOP方式处理Textbox事件?

java - 用于访问子面板元素的更漂亮的解决方案

language-agnostic - "program to an interface"是什么意思?

Javascript 从循环中的嵌套对象调用方法

json - 如何在 golang 中输入混合类型数组?

c++ - 如何在接口(interface)类中创建父类(super class)对象?

c# - 如何创建类字典,以便我可以使用键来确定要初始化哪个新类?

c# - Protobuf-net:无法创建抽象类

java - 为什么我们将类声明为抽象类,即使它没有抽象方法