我曾在接受采访时被问及"OOP的3个主要概念是什么?".我回答说,我认为有4个如下:
遗产
封装
抽象化
多态性
我是对的吗?
语言面向对象有3个要求:
仅支持封装(对象)的语言不是面向对象的,而是模块化的
支持封装(对象)和消息传递(多态)的语言不是面向对象的,而是基于对象的
支持封装(对象),消息传递(多态)和继承(抽象)的语言是面向对象的
注意:抽象是一个更普遍的概念; 封装等是抽象的种类,就像子程序是一种抽象一样.见抽象
我会说抽象不仅仅是一个OOP概念,因为你可以在很多非OOP语言中抽象出来.
这四个支柱是你正确的状态
封装.
抽象化
遗产
多态性
封装处理包含数据,仅此而已.
抽象处理数据抽象,即所有这些数据都是真正相关的.想想一家银行,其中包含有关姓名,年龄,地址,眼睛颜色,最喜欢的领带等信息.眼睛颜色和最喜欢的领带真的与银行要求相关吗?不,这是抽象.
继承涉及泛化.可以应用于多个事物的信息.如果某些东西继承了某些东西,那么可以说它是一种更具体的东西.例如,动物.狗是一种动物,所以狗继承自动物.Jack Russell是一种狗,所以Jack Russell继承了Dog.
多态性处理具有多种形式的事物(poly - morph).编程中有两种,
后期绑定,
你引用的东西是它的通用类型,因此编译器不知道在编译时绑定什么.Think方法Overriding.
早期绑定
您使用不同的签名重新定义方法,即
int add(int a, int b) vs double add(double a, double b)
这些本质上是面向对象的基本原则.这些之间存在很多重叠,因此明确了解每个方法的含义非常重要.
OOP的问题在于没有人愿意给出正确,简洁,一致同意的定义。特别是,我想指出的是,您提到的所有方面都可以在不使用面向对象的情况下付诸实践!
可以做到这一点的两种类型系统是Haskell类型系统,从本质上讲,Haskell类型系统通常不被认为是面向对象的,而具有模板子类化的C ++模板也是如此。但是,也许可以说模板子类模仿OOP。
由于模板子类化不是一种广为人知的机制,因此让我举一个来自SeqAn库的示例。
Stringcstr = "This is a test"; String > dstr = "GATTACA"; cout << "length(" << cstr << ") = " << length(cstr) << endl; cout << "length(" << dstr << ") = " << length(dstr) << endl;
在这里,String
并且String
是“ 抽象类”的继承。它们使用完全不同的方法封装字符串的概念。它们共享多态方法,这两种具体类型的实现方式不同。String<>
length