OOP中的主要概念

Pea*_*nut 26 language-agnostic oop

我曾在接受采访时被问及"OOP的3个主要概念是什么?".我回答说,我认为有4个如下:

  • 遗产
  • 封装
  • 抽象化
  • 多态性

我是对的吗?

Ste*_*owe 49

语言面向对象有3个要求:

  • 仅支持封装(对象)的语言不是面向对象的,而是模块化的
  • 支持封装(对象)和消息传递(多态)的语言不是面向对象的,而是基于对象
  • 支持封装(对象),消息传递(多态)和继承(抽象)的语言面向对象的

注意:抽象是一个更普遍的概念; 封装等是抽象的种类,就像子程序是一种抽象一样.见抽象

  • 一个很好的答案,当然得到了我的投票。您可以通过为上述每个添加几个示例来改进它。 (2认同)

Sma*_*acL 13

我会说抽象不仅仅是一个OOP概念,因为你可以在很多非OOP语言中抽象出来.

  • 你可以做什么样的编程*没有*抽象? (2认同)

小智 6

这四个支柱是你正确的状态

  • 封装.
  • 抽象化
  • 遗产
  • 多态性

封装处理包含数据,仅此而已.

抽象处理数据抽象,即所有这些数据都是真正相关的.想想一家银行,其中包含有关姓名,年龄,地址,眼睛颜色,最喜欢的领带等信息.眼睛颜色和最喜欢的领带真的与银行要求相关吗?不,这是抽象.

继承涉及泛化.可以应用于多个事物的信息.如果某些东西继承了某些东西,那么可以说它是一种更具体的东西.例如,动物.狗是一种动物,所以狗继承自动物.Jack Russell是一种狗,所以Jack Russell继承了Dog.

多态性处理具有多种形式的事物(poly - morph).编程中有两种,

  • 后期绑定,
  • 你引用的东西是它的通用类型,因此编译器不知道在编译时绑定什么.Think方法Overriding.

  • 早期绑定

  • 您使用不同的签名重新定义方法,即 int add(int a, int b) vs double add(double a, double b)

这些本质上是面向对象的基本原则.这些之间存在很多重叠,因此明确了解每个方法的含义非常重要.


Kon*_*lph 5

OOP的问题在于没有人愿意给出正确,简洁,一致同意的定义。特别是,我想指出的是,您提到的所有方面都可以在不使用面向对象的情况下付诸实践!

可以做到这一点的两种类型系统是Haskell类型系统,从本质上讲,Haskell类型系统通常不被认为是面向对象的,而具有模板子类化的C ++模板也是如此。但是,也许可以说模板子类模仿OOP。

由于模板子类化不是一种广为人知的机制,因此让我举一个来自SeqAn库的示例。

String<Char> cstr = "This is a test";
String<Dna, Packed<> > dstr = "GATTACA";

cout << "length(" << cstr << ") = " << length(cstr) << endl;
cout << "length(" << dstr << ") = " << length(dstr) << endl;
Run Code Online (Sandbox Code Playgroud)

在这里,String<Char>并且String<Dna, Packed<> >是“ 抽象类”的继承。它们使用完全不同的方法封装字符串的概念。它们共享多态方法,这两种具体类型的实现方式不同。String<> length