【问题标题】:How is abstraction an advantage of OOP if it can also be done procedurally?如果抽象也可以在程序上完成,那么抽象如何成为 OOP 的优势?
【发布时间】:2021-05-15 20:59:52
【问题描述】:

我对编程完全陌生,不明白为什么抽象是 OOP 的优势。所有网站都提到抽象是 OOP 的主要优势之一,但这也可以通过程序实现。

如果我写:

int add(int x, int y){
   return x + y;
}

int main() {
   int z = add(3,4);
}

抽象用于隐藏背景细节或任何不必要的数据实现,以便用户只看到所需的信息,那么这不也是抽象,因为用户可以在不知道它是如何工作的情况下使用“添加”吗?我是不是把抽象的概念弄错了,因为这基本上是我在网上得到的关于抽象的唯一定义?如果不是,那么如果您可以在没有 OOP 的情况下实现它,那为什么它是一个“优势”?

【问题讨论】:

  • 如果您遇到有人告诉您“OOP”和“抽象”只能用于几种选定的语言,那么您可以告诉他们他们错了。您可以将 OOP 原则和抽象应用于几乎任何语言。
  • 是的,函数就是抽象的一个例子。
  • “抽象”是一个非常宽泛的术语,其含义远不止“代码调用者不必了解实现细节”。
  • 你在这里展示的是一个抽象是的。但是你可以做比 OOP 更复杂的抽象。你可以抽象更多。它不像抽象或没有抽象那样二元化。

标签: c++ oop procedural-programming


【解决方案1】:

你的问题还不错,但有点幼稚。很明显,您正在询问您前面的主题。还好你很好奇。我的意思是没有冒犯。

抽象不是语言支持与否的二进制事物。语言或多或少做了抽象,但所有语言都是汇编语言之上的抽象。我非常喜欢 C,但它不适合抽象。

抽象是一个非常广泛的东西。你的问题有点像管乐器的目的是什么,因为吉他“可以发出声音”。这根本不是要暗示这将是一个愚蠢的问题。我提到它只是为了说明抽象的主题有多广泛。创建一个简单的函数基本上就是冰山一角的几个分子。

只是为了展示一个快速且非常简单的示例:

class Shape {
public:
    virtual double area();
};

class Triangle : public Shape {
private:
    double base, height;

public:
    double area() { return base*height/2.0; }
};

class Square : public Shape {
private:
    double side;

public:
    double area() { return side*side; }
};

int main() {
    Shape shapes = new Shape[10];
    // Init code   
    for(int i=0; i<10; i++) {
        std::cout << "Area: " << shapes[i] << std::endl;
    }
}

这是一个抽象级别,在 C 中实现起来非常混乱。然后,这甚至不是一个非常复杂的示例。在展示 OOP 时,它是最基本的。

请原谅我的 C++ 代码。我从 C++ 中所知道的一切,都是我 20 年前学到的。所以它可能有点老派。也许它甚至没有编译,但这只是为了展示抽象。它的目标是来自 C 的人。

【讨论】:

  • 对象切片有一些微妙之处,您可能希望改变编写调用代码的方式来执行此操作,但它仍然说明了这一点。
  • 数组不支持多态性。也许将示例更改为使用指针?
  • 关于“所有语言都是汇编语言之上的抽象”:当你必须使用汇编器还不知道的指令并且一年左右不会在硬件中使用时(一个成本是在最前沿),你会知道汇编语言也有抽象。
  • @user975989 已修复
  • @EricPostpischil 我不是说程序集没有抽象吗?
猜你喜欢
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 2016-09-23
相关资源
最近更新 更多