+
+interface Interface
+{
+ void hacer();
+}
+
+class Base
+{
+ char[] nombre;
+ this()
+ {
+ nombre = "unknown";
+ printf("Base::this(%.*s)\n", nombre);
+ }
+ this(char[] n)
+ {
+ nombre = n;
+ printf("Base::this(%.*s)\n", n);
+ }
+ ~this()
+ {
+ printf("Base::~this(%.*s)\n", nombre);
+ }
+}
+
+class Sub1: Base
+{
+ this(char[] n)
+ {
+ super(n);
+ printf("Sub1::this(%.*s)\n", nombre);
+ }
+ ~this()
+ {
+ printf("Sub1::~this(%.*s)\n", nombre);
+ }
+}
+
+class Sub2: Base, Interface
+{
+ this(char[] n)
+ {
+ printf("Sub2::this(%.*s)\n", nombre);
+ }
+ ~this()
+ {
+ printf("Sub2::~this(%.*s)\n", nombre);
+ }
+ void hacer()
+ {
+ printf("Sub2::hacer(%.*s)\n", nombre);
+ }
+}
+
+class Otro: Interface
+{
+ void hacer()
+ {
+ printf("Otro::hacer()\n");
+ }
+}
+
+void hacer(Interface i)
+{
+ i.hacer();
+}
+
+int main()
+{
+ printf("\nBase\n");
+ new Base("base");
+ printf("\nSub1\n");
+ new Sub1("sub1");
+ printf("\nSub2\n");
+ Sub2 s2 = new Sub2("sub2");
+ printf("\nHacer\n");
+ hacer(s2);
+ hacer(new Otro);
+ printf("----------------------------------------\n");
+ return 0;
+}