using Nemerle.DesignPatterns; class X['a] { public this (_x : int) { } } class Y { public this (_x : int) { } public this (_x : string) { } } class SX : X[int] { public this (x : int) { base (x) } } class SY : Y { public this (x : int) { base (x) } public this (x : string) { base (x) } } class W ['a,'b] { } class Z { } [AbstractFactory (X[int],Y, W [_, string], System.Exception)] class Factory { } [AbstractFactory (Override (SX, X[int]), Override (SY, Y), Z)] class SubFactory : Factory { } mutable f : Factory = Factory (); def sf = SubFactory (); def p (x : object) { System.Console.WriteLine (x.GetType ().Name) } p (f.CreateX (1)); p (f.CreateY (1)); p (f.CreateY ("aa")); p (f.CreateW ()); p (f.CreateException ("aa")); f = sf; p (f.CreateX (1)); p (f.CreateY (1)); p (f.CreateY ("aa")); p (f.CreateW ()); p (sf.CreateZ ()); /* BEGIN-OUTPUT X`1 Y Y W`2 Exception SX SY SY W`2 Z END-OUTPUT */