Pea*_*nut 26 language-agnostic oop
我曾在接受采访时被问及"OOP的3个主要概念是什么?".我回答说,我认为有4个如下:
我是对的吗?
小智 6
这四个支柱是你正确的状态
封装处理包含数据,仅此而已.
抽象处理数据抽象,即所有这些数据都是真正相关的.想想一家银行,其中包含有关姓名,年龄,地址,眼睛颜色,最喜欢的领带等信息.眼睛颜色和最喜欢的领带真的与银行要求相关吗?不,这是抽象.
继承涉及泛化.可以应用于多个事物的信息.如果某些东西继承了某些东西,那么可以说它是一种更具体的东西.例如,动物.狗是一种动物,所以狗继承自动物.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库的示例。
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