Interfaces con C++

Introducción

En esta primera nota veremos el tema de la programación de interfaces en C++. Comenzaremos describiendo que es una interface en C++, luego veremos como definimos una interface en el código, y finalmente analizaremos las ventajas de este paradigma de programación.

¿Que es una Interface?

Las interfaces surgen como una evolución de la POO (programación Orientada a Objetos) ante la necesidad de reutilizar y agrupar las distintas funcionalidades de un objeto en subconjuntos mas manejables.

Debido a la creciente complejidad de los sistemas modernos cadaz vez mas los objetos (que antes necesitaban solo algunos métodos para poder definir sus funcionalidades) fueron creciendo en complejidad, hasta el punto de tornarse inmanejables por la excesiva cantidad de metodos que contenian (pensemos por ejemplo en un simple control activex que muestre una imagen segun el estado del tiempo y que se insertará en una página Web). Debida a esta creciente complejidad en los sistemas fue que surgiò la necesidad de agrupar las funcionalidades de los objetos en pequeños modulos que a su vez fuesen reutilizables por otros objetos que utilizaban otras implementaciones de la misma funcionalidad.

Podríamos decir en una definición muy casera que “una interface en terminos de c++ es una clase abstracta que encapsula los métodos que definen un cierto comportamiento de un objeto “.

Una interface es una clase abstracta, por lo tanto podemos deducir que una interface, en el sentido puro de la palabra, carece de implementacion. Es decir la implementación de los métodos de la misma estará a cargo del objeto que la contenga, lo cual es logico porque por ejemplo los métodos para dibujar un cuadrado serán muy distintos a aquellos para dibujar una imagen, pero ambos definen un mismo comportamiento por lo que en definitiva podríamos estar hablando de implementaciones distintas de un único metodo dibujar declarado una interface IDibujar.

Entonces la primer pregunta que se nos puede venir a la cabeza será, ¿no existirá alguna manera de ahorrarme de escribir la implementación de cada una de las interfaces que utilice? para solucionar este problema ya hay arquitecturas (COM,DCOM, CORBA) y librerías (ATL) que nos facilitarán enormemente el uso de de interfaces.

¿Como se define una Interface?

Una interface puede ser definida utilizando las palabras reservadas class, struct o interface. El beneficio de utilizar struct o interface es que la visibilidad por defecto de la interface será public mientras que si usamos una clase deberemos especificarlo explicitamente. Por lo tanto una manera sencilla de definir una interface sería:

/*! Interface Para Dibujar Objetos */

class IDraw {

public:

//! Metodo para Dibujar el contenedor

virtual void Draw()=0;

};

Es interesante analizar que esta pasando detrás de los bastidores cuando declaramos una interface.

Si nos remitimos a nuestras primeras lecciones de C++, recordaremos que cuando un método de una clase, es definido virtual. El compilador crea en lugar donde iría el método en memoria, un puntero (vPtr) que apunta a alguna posición de la tabla de todas las funciones virtuales del objeto vTable que finalmente contiene las direcciones de memoria de las implementaciones de todas las funciones virtuales del objeto.

Entonces para la interface IDraw definida anteriormente, la estructura en memoria de una instancia de la interface sería la siguiente:

Diagrama Clase Interface

Un dato un tanto trivial al tener en cuenta es que la palabra interface no es una palabra del lenguaje c++ sino que es un typedef de windows, para ello deberemos incluir en nuestro código el header <windows.h>. Ademas es muy importante tener en cuenta que la definición de una interface nunca trae aparejada una implementación de los metodos sino que la misma se dejará para la clase que implemente la misma.

¿Por Que Utilizar Interfaces?

Una de las principales ventajas de utilizar interfaces es el polimorfismo ya que separamos la definicion de los metodos de su implementación. Ademas cabe notar que nuestro objeto ira cobrando forma a partir de la herencia de distintas interfaces que el mismo deberá ir implementando a su debido Tiempo.

A su vez al no definir ningún tipo de implementación a priori en la definición de una interface tenemos un grado extra de aislación entre la declaración de los metodos que tendra un determinado objeto y sus implementaciones. También es de remarcar que todas las variables del objeto quedarán del lado de la implementación con lo que tendremos un grado de encapsulación extra al utilizar interfaces.

Ademas de todo esto algo muuy importante es la reutilización de codigo. Con el uso de Interfaces (mas algún truquito extra) podremos hacer que los objetos que diseñemos tengan nombres de parámetros estandarizados, lo que permite la portabilidad entre lenguajes. Es decir con el uso de Interfaces y arquitecturas como COM, COM+ podremos diseñar la parte de nuestro proyecto que requiera de procesamiento eficiente en C++ u Assembler y encapsular todas esas funcionalidades en objetos que se puedan cargar desde Visual Basic, Java , HTML o cualquier lenguaje de alto nivel y utilizar las bondades de los mismos para realizar las tareas que mejor se adaptan a ellos.

Conclusión

Hemos visto un primer pantallazo de que se tratan las interfaces y como se definen en C++. Para una segunda entrega que estaré lanzando en breve,  hablare de la arquitectura COM, del lenguaje de definicion de Interfaces MIDL (aka IDL) y de la potencia que subyace debajo de estas herramientas, un poco complicadas de entender al principio, pero que nos permitirán juntar lo mejor de los mundos de bajo y alto nivel en nuestros proyectos

Tags: , , , , , , , ,

13 responses to “Interfaces con C++”

  1. alejandro varela's avatar
    alejandro varela says :

    la verdad que me parece un horror lo de la palabra “interface”, en realidad es un struct con métodos virtuales.

    y también, si vamos al caso, un “método virtual” no es mas que un puntero a una función.

    por lo cual, en vez de escribir:

    interface {
    public:
    virtual void algo();
    };

    se puede escribir:

    struct IAlgo
    {
    public:
    void ( * algo ) ( ) ;
    };

    obteniendo el mismo resultado.
    de hecho yo hago programas orientados a objetos con ANSI C puro, no hace falta programar en C++…

    • alejandro's avatar
      alejandro says :

      el que se da por mas solo porque hace lo mas complicado….
      si es de notar que hacen lo mismo… pero la interface y los virtuales se ven
      mas ordenados y legibles… y el programar legible es un aspecto que debe considerar cualquiera que se quiera llamar programador.

  2. Juan Sebastian Cabrera's avatar
    Juan Sebastian Cabrera says :

    Que tal Alejandro, me parece muy interesante tu comentario, yo he intentado realizar programas orientados a objetos utilizando C. Claro que ha sido de manera informal, no tiene una buena base teórica. Me gustaría saber como tu lo has trabajado y si tienes alguna referencia o ejemplos al respecto.

    Te agradezco mucho por tu información.

    Hasta pronto
    Sebastian

  3. jota's avatar
    jota says :

    alejandro…y en ensamblador no programas orientado a objetos…?

    la idea de punteros se dejó de lado en programación con la finalidad de obtener un nivel de abstracción mayor….
    Gracias a eso podemos dedicar más tiempo a pensar que queremos hacer y no como hacerlo….

    admiro a los sufridores de la programación, pero es como el que se niega a ir al medico por que eso son brujerias, tambien se mueren, es cierto, pero les duele más!

    un saludo alejandro

  4. Cristopher's avatar
    Cristopher says :

    Este resumen es un exito, explica en forma general un poco de todo. Todo programador debe avanzar con las nuevas tecnologias o nos quedaremos atras.

  5. ALEJANDRO VARELA's avatar
    ALEJANDRO VARELA says :

    pido perdon por haberme expresado asi.
    el blog esta muy bueno, y c++ esta bueno tambien, por ejemplo para programar con templates.
    saludos

    • Carlos's avatar
      Carlos says :

      jejeje… tan chistosos esos comentarios, ¿cómo es posible de que hables de programar en ANSI C puro orientado a objetos?… lo unico que me hace pensar eso… es que no conoces bien la Programación Orientada a Objetos (POO), si hablamos de agrupar datos… se pueden usar estructuras en C incluso en C++ también… pero es que la POO NO ES SOLO AGRUPAR DATOS!!!…. es mucho más que eso… es poder emular todo un submundo de datos con un alto nivel de abstracción… en C jamás podrás hacer verdadero polimorfismo… a parte de que no podrás sobrecargar operadores, no podrás generar herencia… ENTIENDE: NO ES LO MISMO USAR “STRUCT” QUE USAR “CLASS”, SIII SE PARECEN, PERO NO SON LO MISMO… LAS ESTRUCTURAS ESTÁN LIMITADAS… POR ESO SE CREÓ C++….!!
      En otras palabras no conoces la potencia de C++… que no solo sirve por los Templates… de hecho es una característica en des-uso…. te recomiendo que leas un poco más sobre POO…

      El artículo está excelente… y las interfaces en C++ o clases abstractas permiten grandes niveles de abstracción lo cual hace más facil la programación de sistemas complejos!!…

      • Miguel Chan's avatar
        Miguel Chan says :

        Estoy llevando Ingeniería de Software II y se puede “Simular” un entorno Orientado a Objetos en C, Sin embargo, es cómo leí más arriba, es querer aporrearse y con ganas. Para qué simularlo? Sí tenemos herramientas para obtener la Orientación a Objetos de manera Pura, Un Saludo!

    • alejandro's avatar
      alejandro says :

      amen! jaja

  6. Fernando Gómez's avatar
    Fernando Gómez says :

    A ver si estoy en lo correcto… Según yo, el código que presentas puede ocultar un bug, dado que la interfaz no declara un destructor virtual…

    class I
    {
    public:
    virtual void foo() = 0;
    };

    class C : public I
    {
    public:
    std::string _foo;
    virtual void foo() { std::cout << _foo <_foo = “Hola mundo”;
    pI->foo();
    delete pI; // ¡fuga de memoria!

    return EXIT_SUCCESS;
    }

    Al menos con C++ 03, sé que algunos compiladores -como Visual C++- se encargan de solucionar esto.

    ¿Cómo ven?

  7. leopoldo lopez's avatar
    leopoldo lopez says :

    como puedo mas bien, como es la elaboracion de un un iterfaz…. muy bien el texto

  8. Ignacio's avatar
    Ignacio says :

    Excelente articulo! Muy claro, conciso, y ademas interesante de leerlo.
    Respecto a lo de C/C++ yo me he canasado de ver hibridos entre C y C++. Creo que se debe a dos cosas. 1) es dificil aisalrse conceptualmente del todo de la programacion estructurada y 2) la compatibilidad entre c y c++ es tan grande que permite crear hibridos a veces sin quererlo. Yo tambien lo he hecho, y aun temo hacerlo a veces cuando mi atencion esta un poco en otro lado.
    Muchos saludos desde alemania!

Trackbacks / Pingbacks

  1. Interfaces (Parte 2): ¿Que es una Interfaz? « CorEngine - July 20, 2009

Leave a comment

Design a site like this with WordPress.com
Get started