面向对象的代码,采用非面向对象的语言

这句话是真的吗?

编写面向对象的代码,即使是非面向对象的语言。

任何人都可以举个例子..或提供一些链接……

是的,你可以这样做,你可以像c这样的过程语言模拟inheritance多态等OOP概念。

既然你要求代码示例,这里有一个:

要模拟inheritance,您需要的只是结构的第一个成员是超类的实例,然后您可以像C ++inheritance一样转换指向基类和派生类的指针。

struct BaseClass { //... }; struct DerivedClass { struct BaseClass super; //.... }; struct DerivedClass d; //UpCasting example struct BaseClass *base_ptr = (struct BaseClass *)&d; //Downclasting Example struct DerivedClass *derived_ptr = (struct DerivedClass *)base_ptr; 

当然,如果你真的需要OOP,你应该使用OOP语言,而不是以这种方式玩游戏。

即使在非面向对象的语言(如C)中,也很有可能编写面向对象的代码。 以此为例:

 typedef struct _Node { struct _Node* next; int data; } Node; // Constructor Node* createNode() { return (Node*)malloc(sizeof(Node)); } // Getter for data int getNodeData(Node* node) { if(node != null) { return node->data; } return -1; } 

等等。 当然,这确实需要程序员更多的纪律,但没有什么能阻止他以面向对象的方式表达他的代码。

考虑一下:如何实现面向对象的语言function? 通常,如果不总是这样,必须有一些面向对象特性的非面向对象的实现:例如,在C ++中,upcasts / downcasts实际上是指针操作:如果我有一个从多个对象inheritance的对象,我将它的内存放置得像所以:

 ->/**********************/ / PARENT 1 FIELDS / /**********************/ / PARENT 2 FIELDS / /**********************/ / CHILD SPECIFIC FIELDS/ 

->是一个指针:当前它指向对象的前面,所以从这里对象看起来像一个CHILD,它inheritancePARENT1和PARENT2。 如果我们将此对象转换为PARENT2,我们只需要更改指针的位置:

  /**********************/ / PARENT 1 FIELDS / -> /**********************/ / PARENT 2 FIELDS / /**********************/ / CHILD SPECIFIC FIELDS/ 

这样从指针向前的存储器布局看起来像PARENT2对象。

类似的操作对于大多数面向对象的操作都是如此。 实现这一点所需要的只是指针,而不是“面向对象”function本身。 因此,在此实现下,如果您有指针,则可以自己创建面向对象。

其中一个着名的例子就是linux内核中的实践。

例如: container_of宏定义为:

 #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); (type *)( (char *)__mptr - offsetof(type,member) );}) 

这只是一些指针操作和转换为“upcast” – 获取父对象。

也许最着名的例子是GTk图书馆和从中衍生出来的Gnome桌面。

这些是用纯C编写的,但遵循纯OO设计原则。

它不难想象。

C ++:

 ret = object->method(parm1,parm2); 

C与笨重的OO:

 ret = method(Objectref,parm1,parm2); 

您可以使用此类和类似的惯用法在C中实现任何OO设计。

他们获得的是在C ++进行标准更改时的性能,兼容性和稳定性。

你失去的是一些编译时validation的灵活性。 您可以指定特定方法需要“三角形”对象作为第一个参数,但您不能拥有一个方法,该方法将采用通用“形状”对象,您必须接受任何参考值。 另外,你需要多加小心。

这里讨论了利弊

如果问题是“是否有可能编写面向对象的代码,即使是非面向对象的语言”,那么答案是肯定的。 例如,原始的C ++编译器被称为cfront,它将C ++作为输入,并输出C.因此可以在C中表达面向对象的代码,这绝对不是面向对象的语言。 但是,由于没有得到编译器的帮助或支持,因此很少有任何理由这样做,并且存在许多缺点。