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
    my_class objectx;
    objectx.value=21;
    objectx.method=&some_function;

    //Method call
    objectx.method(&objectx);

    //Stop!
    fgets(stop,80,stdin);

    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.

 

Tags: