OOP中的主要概念

时间:2008-12-31 13:48:01

标签: oop language-agnostic

我曾在接受采访时被问及“OOP的3个主要概念是什么?”。 我回答说,在我看来有4个如下:

  • 继承
  • 封装
  • 抽象
  • 多态性

我是对的吗?

15 个答案:

答案 0 :(得分:48)

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

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

注意:抽象是一个更通用的概念;封装等是抽象的,就像子程序是一种抽象一样。见Abstraction

答案 1 :(得分:12)

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

答案 2 :(得分:6)

这四个支柱是正确的状态

  • 封装。
  • 抽象
  • 继承
  • 多态性

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

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

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

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

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

  • 早期绑定

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

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

答案 3 :(得分:4)

我知道这些是四骑士。也许他们错误地将遗传和多态性混为一谈。

答案 4 :(得分:4)

OOP的问题在于没有人愿意提供正确的,简明扼要的定义。特别是,我想指出,你提到的所有方面都可以在不使用面向对象的情况下付诸行动!

这样做的两个类型系统是Haskell类型系统,它通常不被认为是面向对象的,而C ++模板具有模板子类化。但是,也许可以认为模板子类化模拟OOP。

由于模板子类化不是一个广为人知的机制,让我举一个SeqAn library发明它的例子。

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

cout << "length(" << cstr << ") = " << length(cstr) << endl;
cout << "length(" << dstr << ") = " << length(dstr) << endl;

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

答案 5 :(得分:3)

是的,那些是标准的四个。

有些人结合了抽象和封装。我不确定为什么......它们不完全正交,但也许有足够的重叠?继承和多态之间肯定存在重叠,但在我看来很难将它们结合起来。

答案 6 :(得分:2)

大多数人会认为这是正确的,我的猜测是,如果他们要求三个,那就是继承,封装和多态。

我个人发现,如果你要落后于OOP的定义,这三个概念就是真正的“肉”。大多数人认为抽象是理所当然的,并且与其他人一起使用,因为它实际上可以被认为是其他三个中的任何一个。

当我谈论OOP时,我总是提到4。

答案 7 :(得分:1)

面向对象

抽象(忽略或隐藏无关紧要的细节)- 主题非常笼统而不基于真实情况的情况。

封装 - 在类内部保持属性和方法私有,因此它们不能从类外部访问。

! API - 本质上是所有非私有、未封装的方法。

继承 - 使某个类的所有属性和方法可供子类使用。

Polymorphism-gr:“多种形状” - 子类可以覆盖从父类继承的方法。

答案 8 :(得分:0)

可能最后三个是他们正在寻找的东西 - 继承可以被认为是一种帮助实现其他目标的机制,这是更高层次的目标。

无论如何都没有真正的答案,特别是如果仅限于“前三名”。

答案 9 :(得分:0)

这是对的。

如果你只需要提供一个,那么,抽象它必须是,对于,不管怎样,其余三个只是抽象在行动

答案 10 :(得分:0)

这篇[文章] [1]提到了良好代码的三大支柱。我发现这是一篇很好的文章,认为封装是面向对象设计的“第一原则”。

“第一”原则是所有其他原则所依据的基本原则。作者使用黄金法则的例子。向孩子们教授文明行为的所有细节是很困难的,但是如果你能让他们理解(更重要的是,实践)对待他人的黄金法则,你就更有可能“得到”我们每天都遵守的所有法律和道德标准。

因此,如果开发人员将封装理解为面向对象开发的“第一原则”,那么所有其他原则将在适当的时候遵循。

我不是作者的内容正义,但我肯定会鼓励人们阅读它。

出于某种原因,我没有显示超链接,所以这里是URL:http://www.netobjectives.com/files/Encapsulation_First_Principle_Object_Oriented_Design.pdf

答案 11 :(得分:0)

OOP中的3个主要概念:

  • 延迟装订
  • 概念重用(无论如何都不确定:重复使用概念;避免重新实现最简单的概念)
  • 抽象

答案 12 :(得分:0)

这对面试来说可能是一个棘手的问题,但是在计算机科学课上,他们现在教授面向对象程序设计的四大支柱。

答案 13 :(得分:0)

问题的正确答案是:“请通过面向对象的编程来澄清你的意思。”哎呀,这就是说,因为要问的真正问题是:“当我说OOP时,我的意思是什么?”

没有正确答案。

答案 14 :(得分:0)

人们普遍认为这些是主要原则,但它们与OO创建的原因关系不大。

指导原则之一是直接操纵隐喻。这是在程序中创建一个表示用户心理模型中的对象的对象。创建OO的大部分动机都是基于心理学而不是数学/ CS,因为这些日子通常被认为是这种情况。

如果怀疑这一点,请看看Trygve Renskauge的一些工作。 MVC和DCI之父或James Coplien完成了作者和演讲者。

所以我说你可能会给他们一个接近他们预期的答案是否正确取决于你的立场。

相关问题