Es C propiamente un lenguaje orientado a objetos?
By unmanarc on 24 April 2004
C es un lenguaje muy extenso, y permite mucho el manejo de memoria, sin embargo, la pregunta original es si podemos transformar el lenguaje C en un lenguaje mas orientado a objetos sin la necesitad de modificar el compilador. Y la respuesta a nuestra duda es que si se puede. No tendríamos todo el poder de C++, solo podríamos crear clases interfaz y llenarlas a tiempo de corrida con algún método constructor o alguna serie de parámetros que inicialicen la estructura, tampoco podríamos especificar si un método, subclase o variable, es de modo privado/publico/protegido.
|
|
Bajar en formato PDF |
Bueno, en mi afán por explorar las posibilidades de este mundo de la programación, y llevar al limite las capacidades de un lenguaje como C, me dedique a escribir un código que nos permite transformar C en un lenguaje Pseudo-Orientado a Objetos
El método que proponemos es inicialmente crear una clase que en programación orientada a objetos sería una estructura interfase.
| typedef struct myclass { int value; void (*method)(void *); } my_class; |
Inmediatamente, se debe crear ese "method" que aun no esta definido, pero como observaremos, en la compilación del programa, ese método puede servir solo para esta clase y solo tendrá que ser asignado a cada una de las instancias con una misma referencia, de modo que el consumo de memoria se hace mínimo entre varias instancias.
Veamos a continuación una función "común" que podría muy bien encajar con la pseudo-clase "my_class".
| void some_function(void * local_ref) { printf("Your number is: %d", ((my_class *)local_ref)->value ); } |
Entonces tenemos una Pseudo-clase interfaz y un método asociado. Ahora veamos como usarlos...
| int _tmain(int argc, _TCHAR* argv[]) { //Is C an object oriented programming language? char stop[80]; //Instance //Method call //Stop! return 0; |
Es claro lo que vemos, una inicialización de una pseudo-clase interfaz llamada objectx. En principio, le asignamos un valor, el 21 al valor que contiene la "clase", y el método lo definimos como una función, es decir como la posición de memoria de la función some_function. Es así como instanciamos la clase y creamos un objeto con métodos y valores, e incluso podría tener referencias a otras pseudo-clases similares.
Para llamarlo, debemos también incluir la referencia a la propia clase, esto debido a que a tiempo de corrida no hay forma de saber cuales son las variables de la clase dentro del método. Quizá esto podríamos ocultarlo a la hora de programar con alguna "macro" deC.