Public interfaces allows complete decoupling of implementation.

Interface.h


pragma once

/*
 * Public Interface.
 * 
*/

struct Interface;

typedef struct InterfaceVtbl
{
  void (*Release)(Interface * This);
};

struct Interface
{
  InterfaceVtbl * lpVtbl;
};

inline void Interface_Release(Interface *p)
{
  p->lpVtbl->Release(p);
}

Object.h

  #pragma once
  Interface * Object_New();

Object.c


struct Object
{
  InterfaceVtbl * lpVtbl;
};

void Object_Release(Interface *p)
{  
  free((Object*)p);
}

Interface * Object_New()
{
  /*vtable*/
  static struct InterfaceVtbl vtbl = { &Object_Release };

  Object * p = (Object*)malloc(sizeof(Object));
  p->lpVtbl = &vtbl;

  return (Interface*)p;
}


int main(int argc, char* argv[])
{
  Interface * p = Object_New();
  Interface_Release(p);
  return 0;
}